簡體   English   中英

關於協變返回類型的C ++規則是什么?

[英]What the C++ rules in regard to covariant return types?

就像下面的例子一樣,允許什么,如何以及為什么?

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

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
};

Pff,太長的標准報價。

如果(a)它是一個指針/引用,你可以使用另一種類型作為協變量(b)只需添加一個在編譯時已知的常量就可以將它轉換為先前的返回類型(c)它符合所有常量 - 易失性預選賽。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM