5.4 Virtuelle Basisklassen
  • Bei mehrfachen Vererbungen kann eine "Großeltern"-Klasse über die Basisklassen mehrfach beerbt werden. Dann sind die Methoden der Großeltern ggf. auch mehrfach vorhanden und müssen über die Basisklasse qualifiziert werden:

       class Mensch { String name; };
       class Mann: public Mensch {};
       class Programmierer: public Mensch {};

       class MannProgrammierer: public Programmierer, public Mann {};

    Falsch:
            MannProgrammierer.name ist nicht eindeutig.

    Korrekt:
            MannProgrammierer.Mensch::name
            MannProgrammierer.Mann::name

    Der MannProgrammierer hat zwei Namen!
  • Um Vervielfältigungen im Rahmen von Mehrfachvererbungen zu vermeiden kann beim Status der Ableitung das Schlüsselwort "virtual" angegeben werden. Alle als virtual deklarierten Klassen werden in der Hierarchie zusammengefasst:

       class Frau: virtual public Mensch {};
       class Programmierer: virtual public Mensch {};

       class FrauProgrammierer: public Programmierer, public Frau {};

       FrauProgrammierer.name ist eindeutig.
  • virtual Klassen werden vom Konstruktor der am weitesten abgeleiteten Klasse initialisiert (im Beispiel von FrauProgrammierer). Lösung: ggf. default-Konstruktoren (protected) richtig setzen.