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

时间:2009-11-06 17:45:34

标签: c++

如下例所示,允许的内容,方式和原因?

class Shape {
      public:
        //...
        virtual Shape *clone() const = 0; // Prototype
        //...
    };
    class Circle : public Shape {
      public:
        Circle *clone() const;
        //...
    };

2 个答案:

答案 0 :(得分:10)

C ++ Standard 2003. 10.3.5

  

覆盖的返回类型   功能应与...相同   被覆盖的返回类型   函数或协变与类   的功能。如果是函数D :: f   覆盖函数B :: f,返回   函数的类型是协变的   如果他们满足以下要求   标准:

     

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

     

- 返回类型中的类   B :: f与类中的类相同   D :: f的返回类型,或是   直接或明确无误的   中的类的间接基类   D :: f

的返回类型      

- 指针或引用都有   相同的cv资格和   返回类型为D :: f的类类型   具有与或相同的cv资格   比班级更少的cv资格   输入B :: f的返回类型。

     

如果D :: f的返回类型不同   从B :: f的返回类型来看   返回类型为D :: f的类类型   应该完整的   声明D :: f或应为   类型D.当重写时   函数被称为final   覆盖的覆盖功能,   其结果将转换为类型   由(静态选择)返回   被覆盖的功能(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
};

答案 1 :(得分:4)

Pff,太长的标准引用。

如果(a)它是一个指针/引用,你可以使用另一种类型作为协变量(b)只需添加一个在编译时已知的常量(c)就可以将它转换为先前的返回类型它符合所有类型常量挥发性限定符。