2009-11-06 11 views
5

Jak w poniższym przykładzie, co jest dozwolone, w jaki sposób i dlaczego?Co zasady C++ w odniesieniu do kowariantnych typów zwrotu?

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

Czym dokładnie jest pytanie? Jeśli znasz termin * kowariancja *, to prawdopodobnie wiesz, co to znaczy. Tak więc odpowiedź brzmi: kowariantne typy zwrotów są dozwolone. to jest to! – AnT

+0

Tylko jeden link dla osób nieobjętych kowariantnym typem zwrotu: http://pl.wikipedia.org/wiki/Covariant_return_type –

+1

Zasada nr 1 zwrotów kowariantnych - nie używaj VC6. –

Odpowiedz

10

C++ standard 2003. 10.3.5

typu powrotu nadrzędnego funkcji powinna być identyczna typ wartości Zastępowana funkcji lub kowariantna z klasami funkcji. Jeśli funkcja D :: F nadpisuje funkcję B :: F, podczas gdy zwrot rodzaje funkcji są kowariantna jeśli spełniają następujące kryteria:

- oba są wskaźniki do klas lub odniesień do klas

- klasa w rodzaju powrotnego B :: f jest tej samej klasy, klasy w zwracanego typu D :: f lub jest jednoznaczne i dostępne bezpośrednio lub pośrednio podstawy z klasy klasa w typ zwrotu D :: f

- oba wskaźniki lub odniesienia mają takie samo CV kwalifikacji i typ klasa w rodzaju powrotnego D :: f ten sam CV kwalifikacje jak lub mniej CV kwalifikacje niż typ klasy w typie zwrotu B :: f.

Jeżeli typ powrotu D :: f różni od rodzaju powrotnej B :: f typ klasa w rodzaju powrotnego D :: f jest zakończona w momencie zgłoszenia D :: f lub są typu klasy D. Jeżeli nadrzędny jest wywoływana w końcowym overrider funkcji zastąpionej, wynik jest przekształcany do rodzaju zwróconego przez (statycznie wyboru) zastąpionej funkcji (5,2 .2).

przykład:

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 zbyt długi średnia cytowania.

Możesz użyć innego typu jako kowariantu, jeśli (a) jest on wskaźnikiem/odnośnikiem (b) może być rzutowany na poprzedni typ zwrotu przez zwykłe dodanie stałej znanej w czasie kompilacji (c) jest zgodny z wszystkie kwalifikatory o stałej lotności.

+0

Być może (b) będzie potrzebował dalszych wyjaśnień.Nie jest zbyt powszechne definiowanie rzutów pod względem stałych czasowych kompilacji. –

+0

Dla dalszych wyjaśnień inny post służy najlepiej –

Powiązane problemy