Virtuelle Basisklassen

Aus Appmethod Topics
Wechseln zu: Navigation, Suche

Nach oben zu Klassen - Index

Eine virtuelle Basisklasse wird auf mehreren Wegen indirekt an eine abgeleitete Klasse vererbt.

Eine Basisklasse kann nicht mehr als einmal in einer abgeleiteten Klasse spezifiziert werden:

class B { ... };
class D : B; B { ... };  // UNGÜLTIG

Allerdings ist es möglich, eine Basisklasse indirekt mehrmals an eine abgeleitete Klasse zu übergeben:

class X : public B { ... };
class Y : public B { ... };
class Z : public X, public Y { ... };  // OK

In diesem Fall hat jedes Objekt der Klasse Z zwei Unterobjekte der Klasse B.

Falls dies zu Problemen führt, kann dem Basisklassen-Spezifizierer das Schlüsselwort virtual hinzugefügt werden. Beispiel:

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

B ist nun eine virtuelle Basisklasse, und die Klasse Z hat nur ein Unterobjekt der Klasse B.

Konstruktoren für virtuelle Basisklassen

Konstruktoren für virtuelle Basisklassen werden vor allen Konstruktoren nicht-virtueller Basisklassen aufgerufen.

Wenn die Hierarchie viele virtuelle Basisklassen enthält, werden die virtuellen Basisklassenkonstruktoren in der Reihenfolge aufgerufen, in der sie deklariert wurden.

Alle nicht-virtuellen Basisklassen sind dann konstruiert, bevor der abgeleitete Klassenkonstruktor aufgerufen wird.

Wenn eine virtuelle Klasse von einer nicht-virtuellen Basis abgeleitet ist, dann wird die nicht-virtuelle Basis zuerst vorhanden sein, so dass die virtuelle Basisklasse richtig konstruiert werden kann. Der folgende Quelltext

class X : public Y, virtual public Z
 X one;

führt zu folgender Reihenfolge:

Z();   // Initialisierung der virtuellen Basisklasse
Y();   // nicht-virtuelle Basisklasse
X();   // abgeleitete Klasse

Siehe auch