Wenn wie in vorigem Beispiel mehrfacher Vererbung zwei Basisklassen von derselben Basisklasse abgeleitet sind, so ist diese übergeordnete Basisklasse zweimal in einem Objekt enthalten
/ class Aa \
class A --> --> class B
\ class Ab /
Dies wird oft so erwünscht sein oder zumindest keine Probleme aufwerfen.
Es kann aber auch vorkommen, daß es überflüssig ist z.B. zwei Objekte
der Klasse A
in einem Objekt der Klasse B
zu haben, wenn
A
vor allem Methoden zur Verfügung stellt.
Man kann eine Ableitung als virtual
deklarieren. Die entsprechende
Basisklasse ist dann für künftige Vererbungen virtuell und wird bei
mehrfacher Vererbung nur einmal eingebunden. Die Klassendeklarationen ändern
sich nur an zwei Stellen:
B b;
class A
Der Vorteil ist, daß zum einen Speicherplatz gespart wird und zum anderen auch
Merhdeutigkeiten verschwinden. Die Basisklasse wird nur noch einmal aufgenommen, so
daß der Aufruf eindeutig ist.
{
public:
int x;
};
class Aa : public virtual A { ... }; // virtuelle Ableitung
class Ab : virtual public A { ... }; // Reihenfolge beliebig
class B : public Aa, public Ab { ... };
b.x; // Keine Mehrdeutigkeit: Klasse A nur einmal vorhanden