2012-12-06 15 views
7

Capisco il concetto di ereditarietà virtuale, ma non ho potuto trovare la risposta a questo ovunque. Supponiamo che tu abbia la classe D che eredita la classe B e C. Sia B che C ereditano la classe A. Quindi potresti fare in modo che B e C ereditino virtualmente A per evitare due istanze di A. Ma devi specificare l'ereditarietà virtuale sia in B che in C o crea già una sola istanza di A se uno dei due praticamente eredita A e l'altro no?Virtual Inheritance, una classe sufficiente?

Grazie

risposta

11

Devono essere tutti virtual. Da C++ 11 10.1 [class.mi]/7:

Una classe può avere sia classi di base virtuali che non virtuali di un determinato tipo.

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

Per un oggetto della classe AA, tutte le occorrenze virtuali di classe base B nel reticolo classe di AA corrispondono ad un singolo B sottoggetto all'interno dell'oggetto di tipo AA, ed ogni altra occorrenza di un (non virtuale) La classe di base B nel reticolo classe AA corrisponde a uno a uno con un subwoofer B distinto all'interno dell'oggetto di tipo AA. Data la classe AA sopra definito, classe AA ha due sotto-oggetti della classe B: s ZB e virtuale B condivisa da X e Y, come illustrato di seguito.

virtual inheritance example

+0

Inoltre, §10.1/4 in realtà definisce questo. –

+0

@sftrabbit: in quale copia dello standard? In C++ 03, è '10.1 [class.mi]/6'; nell'ultimo documento di lavoro disponibile, N3485, è ancora '10.1 [class.mi]/7'. Non ho copie standard dove è definito in '10.1 [class.mi]/4'. –

+0

Mi sono sempre chiesto perché non hanno permesso che cosa OP sta chiedendo però. Non vedo alcun ostacolo logico per il bambino virtuale che punta al genitore del bambino non virtuale. – enobayram

7

è necessario specificare l'ereditarietà virtuale per entrambi B e C di avere uno A. In caso contrario, la classe che non utilizza l'ereditarietà virtuale "quota" di classe A.

Questo può mettere in grado di hanno la seguente:

inheritance

perché si vuole fare questo è un altro discorso.

+0

Purtroppo posso accettare solo una risposta, grazie comunque per la spiegazione;) – Invalid

+4

Sto dando +1 per il diagramma disegnato a mano e scansionato. –