Methoden im Konstruktor



  • Darf man Methoden im Konstruktor aufrufen?



  • *Im* Konstruktor oder in der Initialisierungsliste? Also *im* Konstruktor auf jeden Fall, da das Objekt bereits vollständig erzeugt wurde.

    MfG SideWinder



  • Vorsicht bei virtuellen Funktionen in Konstruktoren und Destruktoren ...



  • @Bashar: warum vorsicht ? 😕
    gibst da etwas besonders zu beachten ?

    cu



  • Der ctor der Basis-Klasse wird als erster aufgerufen. Somit ist bei einem Aufruf einer virtuellen Funktion im ctor der Basis-Klasse, die abgeleitete Klasse noch nicht vollständig konstruiert. Die Destruktoren werden in umgekehrten Reihenfolge aufgerufen, hier gilt das gleiche.



  • Nicht nur das, aber es wird dabei grundsätzlich die Methode der Klasse aufgerufen, die gerade konstruiert wird.

    class Base {
      virtual void foo() { cout << "Base" << endl; }
      public:
        Base() { foo(); }
    };
    
    class Derived : public Base {
      void foo() { cout << "Derived"; }
    };
    
    Derived d; // Ausgabe: "Base", trotz virtual
    


  • Liegt es daran, dass die Zeiger auf virtuelle Funktionen von derived, zum Zeitpunkt des Aufrufs, noch nicht in die vtable eingetragen sind, oder? 🙂



  • Jein. Es gibt nur eine vtable pro Klasse, die kann logischerweise nicht andauernd verändert werden, wenn ein Objekt konstruiert oder destruiert wird. Der Zeiger zur vtable wird aber verändert.


Log in to reply