virtuelle Basisklassen (1/2)

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:

class A
{
  public:
    int x;
};
class Aa : public virtual A { ... };   // virtuelle Ableitung
class Ab : virtual public A { ... };   // Reihenfolge beliebig
class B : public Aa, public Ab { ... };

B b;
b.x;   // Keine Mehrdeutigkeit: Klasse A nur einmal vorhanden
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.