2012-12-06 8 views
7

Ich verstehe das Konzept der virtuellen Vererbung, aber ich konnte nirgendwo die Antwort finden. Nehmen wir an, Sie haben Klasse D, die Klasse B und C erbt. Sowohl B als auch C erben Klasse A. Sie könnten also B und C virtuell A erben lassen, um zwei Instanzen von A zu vermeiden. Aber müssen Sie virtuelle Vererbung an B und C angeben oder erstellt es bereits nur eine Instanz von A, wenn einer der beiden virtuell A erbt und der andere nicht?Virtuelle Vererbung, eine Klasse genug?

Dank

Antwort

11

Sie alle virtual sein müssen. Ab C++ 11 10.1 [class.mi]/7:

Eine Klasse kann sowohl virtuelle als auch nicht virtuelle Basisklassen eines bestimmten Typs haben.

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

Für ein Objekt der Klasse AA, alle virtuellen Vorkommen von Basisklasse B in der Klasse Gitter von AA entsprechen einer einzelnen B Subobjekt innerhalb des Objekts des Typs AA und jedem anderen Auftreten eines (nicht virtuellen) Basisklasse B im Klassengitter von AA entspricht eins zu eins mit einem unterscheidbaren Unterobjekt B innerhalb des Objekts vom Typ AA. Angesichts der Klasse AA oben definiert, Klasse AA hat zwei Subobjekte der Klasse B: Z ‚s B und die virtuellen B geteilt durch X und Y, wie unten gezeigt.

virtual inheritance example

+0

Auch §10.1/4 definiert dies tatsächlich. –

+0

@sftrabbit: In welcher Kopie des Standards? In C++ 03 ist es "10.1 [class.mi]/6"; im letzten verfügbaren Arbeitspapier, N3485, ist es immer noch "10.1 [class.mi]/7". Ich habe keine Standardkopien, wo es in '10.1 [class.mi]/4' definiert ist. –

+0

Ich habe mich immer gewundert, warum sie nicht erlaubt haben, was OP fragt. Ich sehe kein logisches Hindernis für das virtuelle Kind, das auf das Elternteil des nicht-virtuellen Kindes zeigt. – enobayram

7

Sie müssen sowohl für B und C virtuelle Vererbung geben Sie eine A. Andernfalls, die Klasse zu haben, die nicht virtuelle Vererbung verwendet wird „Share“ Klasse A.

Dieses ermöglichen kann, folgende Voraussetzungen erfüllt sein:

inheritance

Warum wollen Sie tun dies eine andere Sache.

+0

Leider kann ich nur eine Antwort akzeptieren, danke für die Erklärung;) – Invalid

+4

Ich gebe +1 für das handgezeichnete und eingescannte Diagramm. –