Virtuelle Basisklasse



  • Hallo,
    in meinem C++ Buch steht folgendes Beispiel:

    #include<iostream>
    
    class Basis {
        public:
       Basis() { std::cout << "Basis-Standard-Konstruktor\n"; }
            Basis(const char* a)  { std::cout << a << std::endl; }
            virtual ~Basis(){}  // virtueller Destruktor
    };
    
    class Links : virtual public Basis {
        public:
             Links(const char* a)
    //  : Basis(a)             // siehe Text
             { }
    };
    
    class Rechts : virtual public Basis {
        public:
             Rechts(const char* a) : Basis(a) {}
    };
    
    class Unten: public Links, public Rechts {
        public:
             Unten(const char* a) :
    //       Basis(a),             // siehe Text
             Links(a), Rechts(a)  {}
    };
    
    int main() {
        Unten x("Unten");
        Links li("Links");
    }
    

    Und der Text dazu:
    "Es gibt zweimal Basis-Standardkonsruktor aus. Der Basisklasseninitialisierer basis(a) in der Klasse Rechts wird vom Konstruktor von Unten ignoriert!. Stattsessen wird nur der beim Konstruktor von Unten direkt angegebene Basisklassenkonstrktor berücksichtigt. Da er hie auskommentiert ist, wird der Standardkonstruktor von basis genommen. Wenn jedoch die Komentarzeichen // aus der Initialisierungsliste entfernt werden, ist die Ausgabe:
    Unten
    Links"

    Irgendwie verstehe ich das nicht so recht.

    Also mit Kommentrarzeichen. Es soll ein Objekt Unten konstruiert werden. Die Initialisierungsliste ruft die Konstruktoren von rechts und links auf. Aber wieso wird die Initialisierungsliste hier ignoriert?
    Und ohne Kommentarzeichen verstehe ich leider noch weniger. Kann mir das bitte noch mal jemand verständlich erklären?

    Danke



  • Das Beispiel soll zeigen, dass der Konstruktor von Basis nicht mehr indirekt durch
    die Links - und Rechtskonstruktoren aufgerufen wird,
    sondern expliziet im Unten-Konstruktor angegeben werden muss.
    Warum?
    Weil virtuelles ableiten ja hier heisst, dass Unten nur ein Teilobjekt von Basis enthält.
    Wenn jetzt aber der Basis-Konstruktor z.B. ein Member-String setzen würde und
    Links Basis('Links') und Rechts Basis('Rechts') aufrufen wüde,
    welchen Wert sollte die Member-Variable dann annehmen?

    Hoffe das hilft.


Log in to reply