Kursinhalt
C++ OOP
C++ OOP
Konstruktor und Destruktor in der Vererbung
Basisklassenkonstruktor 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 der Schlüssel zum Verständnis der Vererbungsdynamik. Schauen Sie sich die Ausgabe des untenstehenden Code-Snippets an, um die Reihenfolge der Konstruktoraufrufe zu sehen.
main
#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; }
Merken
Sobald der Basisklassen-Konstruktor seine Initialisierung abgeschlossen hat, wird der abgeleitete Klassen-Konstruktor ausgeführt.
Die Superklasse 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
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 rufen wir den Konstruktor mit Parametern in der Initialisierungsliste auf. Sie müssen den Superklassen-Konstruktor explizit innerhalb der Initialisierungsliste des Unterklassen-Konstruktors aufrufen. Wenn Sie keinen Basisklassenkonstruktor in der Initialisierungsliste angeben, wird der Standardkonstruktor der Superklasse automatisch aufgerufen.
Destruktor der abgeleiteten Klasse zuerst
Wenn ein Objekt zerstört wird, werden Destruktoren in umgekehrter Reihenfolge ihrer Konstruktoren aufgerufen. Das bedeutet, dass Destruktoren zuerst für die am meisten abgeleitete Klasse und dann für jede Basisklasse in umgekehrter Reihenfolge ihrer Deklaration aufgerufen werden.
main
#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; }
Merken
Erst nachdem der Basisklassen-Destruktor seine Bereinigung abgeschlossen hat, wird der abgeleitete Klassen-Destruktor aufgerufen.
Danke für Ihr Feedback!