Kursinhalt
C++ OOP
C++ OOP
Konstruktor und Destruktor in der Vererbung
Konstruktor der Basisklasse zuerst
Im Kontext der Vererbung spielen Konstruktoren eine entscheidende Rolle bei der korrekten Initialisierung abgeleiteter Klassen. Das Verständnis der Reihenfolge, in der Konstruktoren aufgerufen werden, ist entscheidend, um die Dynamik der Vererbung zu erfassen. Betrachten Sie die Ausgabe des folgenden Codeausschnitts, um die Reihenfolge der Konstruktoraufrufe zu sehen.
main.cpp
#include <iostream> class Base { public: Base() { std::cout << "Base constructor called" << std::endl; } }; class Derived : public Base { public: Derived() { std::cout << "Derived constructor called" << std::endl; } }; int main() { Derived derivedObj; }
Sobald der Konstruktor der Basisklasse seine Initialisierung abgeschlossen hat, wird der Konstruktor der abgeleiteten Klasse ausgeführt.
Die Oberklasse wird zuerst aufgerufen, da sie die geerbten Mitglieder der Unterklasse initialisieren muss. Dies stellt sicher, dass die Unterklasse mit einem gültigen Zustand beginnt und sich auf den initialisierten Zustand ihrer Basisklasse verlassen kann.
main.cpp
class Base { public: Base(int value) : data(value) {} private: int data; }; class Derived : public Base { public: Derived(int value) : Base(value) {} }; int main() { }
Im Beispiel wird der Konstruktor mit Parametern in der Initialisierungsliste aufgerufen. Der Konstruktor der Oberklasse muss explizit innerhalb der Initialisierungsliste des Konstruktors der Unterklasse aufgerufen werden. Wenn im Initialisierer keine Basisklassen-Konstruktor angegeben wird, wird der Standardkonstruktor der Oberklasse automatisch aufgerufen.
Destruktor der abgeleiteten Klasse zuerst
Beim Zerstören eines Objekts werden Destruktoren in umgekehrter Reihenfolge zu den Konstruktoren aufgerufen. Das bedeutet, dass zuerst der Destruktor der am weitesten abgeleiteten Klasse und anschließend die Destruktoren der Basisklassen in umgekehrter Reihenfolge ihrer Deklaration ausgeführt werden.
main.cpp
#include <iostream> class Base { public: ~Base() { std::cout << "Base destructor called" << std::endl; } }; class Derived : public Base { public: ~Derived() { std::cout << "Derived destructor called" << std::endl; } }; int main() { Derived derivedObj; }
Erst nachdem der Destruktor der abgeleiteten Klasse seine Aufräumarbeiten abgeschlossen hat, wird der Destruktor der Basisklasse aufgerufen.
Danke für Ihr Feedback!