Virtuelle Basisklassen
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
- C++-Klassen
- Klassentypen
- Gültigkeitsbereich Klasse
- Klassenobjekte
- Klassen-Member-Liste
- Member-Funktionen
- Das Schlüsselwort this
- Statische Elemente
- Inline-Funktionen
- Gültigkeitsbereich von Elementen
- Verschachtelte Typen
- Element-Zugriffskontrolle
- Zugriff auf Basisklassen und abgeleitete Klassen
- Friends von Klassen