Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么是C++;关于协变回报类型的规则?_C++ - Fatal编程技术网

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

C++ 什么是C++;关于协变回报类型的规则?,c++,C++,就像下面的例子一样,什么是允许的,如何以及为什么 class Shape { public: //... virtual Shape *clone() const = 0; // Prototype //... }; class Circle : public Shape { public: Circle *clone() const; //... }; C++标准2

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

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

C++标准2003。10.3.5

重写的返回类型 功能应与 被重写对象的返回类型 函数或类的协变 功能的定义。如果函数D::f 重写函数B::f,返回 函数的类型是协变的 如果他们满足以下条件 标准:

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

-返回类型中的类 B::f与中的类是同一个类 D::f或的返回类型是 不含糊的、可访问的、直接或间接的 中类的间接基类 D::f的返回类型

-指针或引用都具有 相同的简历资格和 D::f的返回类型中的类类型 具有与或相同的简历资格 简历资历不如班级 输入返回类型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
};

Pff,标准引用太长


如果(a)它是指针/引用(b)它可以通过仅仅添加编译时已知的常量而转换为先前的返回类型(c)它符合所有常量volatile限定符,则可以使用另一种类型作为协变变量。

问题到底是什么?如果你知道协变项,那么你可能知道它的意思。因此,答案是:协变回报类型是允许的。就是这样。对于不熟悉协变回报类型的人,只有一个链接:协变回报规则#1-不要使用VC6。请更具体地回答您的问题。@Seth-问题的哪一部分不清楚?也许(b)需要进一步澄清。根据编译时间常数来定义强制转换并不太常见,为了进一步澄清,另一篇文章最好