2009-11-06 4 views
5

Wie im folgenden Beispiel, was ist erlaubt, wie und warum?Was regelt das C++ in Bezug auf kovariante Rückgabetypen?

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

Was genau ist die Frage? Wenn Sie den Begriff * covariant * kennen, wissen Sie wahrscheinlich, was es bedeutet. Die Antwort lautet also: Kovariante Rückgabetypen sind erlaubt. Das ist es. – AnT

+0

Nur ein Link für Leute, die nicht mit dem kovarianten Rückgabetyp vertraut sind: http://en.wikipedia.org/wiki/Covariant_return_type –

+1

Regel # 1 der kovarianten Rückgabe - VC6 nicht verwenden. –

Antwort

10

C++ Standard-2003. 10.3.5

Der Rückgabetyp einer übergeordneten Funktion ist entweder identisch mit dem Rückgabetyp der überschrieben Funktion oder covariant mit den Klassen der Funktionen. Wenn eine Funktion D :: f eine Funktion B :: f überschreibt, sind die Rückgabe Typen der Funktionen covariant , wenn sie erfüllen die folgenden Kriterien :

- beide sind Zeiger auf Klassen oder Verweise auf Klassen

- die Klasse in dem Rückgabetyp B :: f die gleiche Klasse wie die Klasse in den Rückgabetyp von D :: f ist, oder ist eine eindeutig und zugänglich direkte oder indirekte Basisklasse von der Klasse in der Rückgabetyp von D :: f

- beiden Zeiger oder Referenzen haben die gleiche cv-Qualifikation und den Klassentyp in dem Rückgabetyp von D :: f hat die gleiche cv-Qualifikation als oder weniger cv-Qualifikation als die Klasse Typ im Rückgabetyp von B :: f.

Wenn der Rückgabetyp von D :: f unterscheidet vom Rückgabetyp von B :: f, der Klassentyp in dem Rückgabetyp von D :: f wird an der Stelle der Erklärung D vollständig sein :: f selbst oder der Klassentyp D. Wenn die übergeordnete Funktion als letzte Übergehungseinrichtung der außer Kraft gesetzten Funktion aufgerufen werden, dessen Ergebnis die Art umgewandelt wird, durch die (statisch gewählt) überschriebene Funktion zurückgegeben (5,2 .2).

Beispiel:

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

Pff, zu lange Standard zitiert. Sie können einen anderen Typ als Kovariante verwenden, wenn (a) ein Zeiger/Verweis (b) auf den vorherigen Rückgabetyp durch bloße Addition einer Konstante kompiliert werden kann, die zum Zeitpunkt der Kompilierung bekannt ist (c) alle konstant-flüchtigen Qualifier.

+0

Vielleicht (b) würde eine weitere Klarstellung benötigen.Es ist nicht allzu üblich, Umwandlungen in Bezug auf die Kompilierungszeitkonstanten zu definieren. –

+0

Zur weiteren Klärung dient ein anderer Beitrag am besten –

Verwandte Themen