关于协变返回类型的C++规则是什么?

veh*_*zzz 5 c++

就像下面的例子一样,允许什么,如何以及为什么?

class Shape {
      public:
        //...
        virtual Shape *clone() const = 0; // Prototype
        //...
    };
    class Circle : public Shape {
      public:
        Circle *clone() const;
        //...
    };
Run Code Online (Sandbox Code Playgroud)

Ale*_*tov 10

C++ Standard 2003. 10.3.5

重写函数的返回类型应与重写函数的返回类型相同或与函数类的协变相同.如果函数D :: f覆盖函数B :: f,则函数的返回类型如果满足以下条件则是协变的:

- 两者都是类的指针或类的引用

- 返回类型B :: f中的类与D :: f的返回类型中的类相同,或者 D类的返回类型中类的明确且可访问的直接或间接基类: :F

- 指针或引用都具有相同的cv限定,并且返回类型D :: f中的类类型具有与B :: f的返回类型中的类类型相同的cv-qualification或更少的cv-qualification.

如果d :: f的返回类型从B :: f的返回类型不同,在d的返回类型的类类型::˚F应为d的声明:: f的点完全或应当是类类型D.当重写函数被调用为重写函数的最终覆盖时,其结果将转换为(静态选择)重写函数(5.2.2)返回的类型.

例:

class B {};
class D : private B { friend class Derived; };
struct Base {
  virtual B*  vf4();
  virtual B*  vf5();
};
class A;
struct Derived : public Base {
  D* vf4();  // OK: returns pointer to derived class
  A* vf5();  // error: returns pointer to incomplete class
};
Run Code Online (Sandbox Code Playgroud)