2012-12-06 9 views
7

Rozumiem pojęcie wirtualnego dziedziczenia, ale nigdzie nie mogłem znaleźć odpowiedzi na to pytanie. Powiedzmy, że masz klasę D, która dziedziczy klasę B i C. Obydwa B i C dziedziczą klasę A. Zatem możesz sprawić, że B i C wirtualnie odziedziczą A, aby uniknąć dwóch wystąpień A. Ale musisz określić dziedziczenie wirtualne zarówno w B, jak i C lub czy już tworzy tylko jedną instancję A, jeśli jedno z dwóch dziedziczy A, a drugie nie?Wirtualne dziedzictwo, jedna klasa wystarczy?

Dzięki

Odpowiedz

11

wszystkim muszą one być virtual. Z C++ 11 10.1 [class.mi]/7:

Klasa może zawierać zarówno wirtualne, jak i nie-wirtualne klasy bazowe danego typu.

class B { /* ... */ }; 
class X : virtual public B { /* ... */ }; 
class Y : virtual public B { /* ... */ }; 
class Z : public B { /* ... */ }; 
class AA : public X, public Y, public Z { /* ... */ }; 

Dla obiektu klasy AA wszystkie zdarzenia wirtualnego klasy bazowej B w klasie kraty AA odpowiadają pojedynczemu B podobiektu w obiekcie typu AA i każde inne zdarzenia (nie jako wirtualne) klasa podstawowa B w kratce klasowej AA odpowiada jeden-do-jednego z odrębnym podobiektem B w obiekcie typu AA. Biorąc klasa AA zdefiniowano powyżej, grupa AA dwa podobiekty klasy B: Z „S B i wirtualnego B współdzielony przez X i Y, jak pokazano poniżej.

virtual inheritance example

+0

Również, §10.1/4 faktycznie to definiuje. –

+0

@ftopbit: W jakiej kopii standardu? W C++ 03 jest to "10.1 [klasa.mi]/6"; w najnowszym dostępnym dokumencie roboczym, N3485, nadal jest to "10.1 [klasa.mi]/7". Nie mam żadnych standardowych kopii, gdzie jest to zdefiniowane w '10.1 [class.mi]/4'. –

+0

Zawsze się zastanawiałem, dlaczego nie pozwalają na to, co OP pyta. Nie widzę żadnej logicznej przeszkody dla wirtualnego dziecka wskazującego na rodzica dziecka nie-wirtualnego. – enobayram

7

musisz określić wirtualny dziedziczenia zarówno B i C mają jedną klasę A. W przeciwnym razie, że nie używa wirtualnego dziedziczenie będzie „akcji” klasa A.

To może umożliwić nam są następujące:

inheritance

Dlaczego chcesz to zrobić, to inna sprawa.

+0

Niestety mogę tylko przyjąć jedną odpowiedź, dziękuję za wyjaśnienie;) – Invalid

+4

Daje +1 dla wykresu rysowane ręcznie i skanowane w. –