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.