Cursusinhoud
C++ OOP
C++ OOP
Constructor en Destructor in Overerving
Eerst de Constructor van de Basisklasse
In de context van overerving spelen constructors een essentiële rol bij het correct initialiseren van afgeleide klassen. Inzicht in de volgorde waarin constructors worden aangeroepen is cruciaal om de dynamiek van overerving te begrijpen. Bekijk de uitvoer van het onderstaande codefragment om de volgorde van constructor-aanroepen te zien.
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; }
Zodra de constructor van de Basisklasse zijn initialisatie heeft voltooid, wordt de constructor van de Afgeleide Klasse uitgevoerd.
De superklasse wordt eerst aangeroepen omdat deze de geërfde leden van de subklasse moet initialiseren. Dit zorgt ervoor dat de subklasse begint met een geldige toestand en kan vertrouwen op de geïnitialiseerde toestand van zijn basisklasse.
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() { }
In het voorbeeld roept u de constructor met parameters aan in de initializer list. U moet expliciet de constructor van de superklasse aanroepen binnen de initializer list van de constructor van de subklasse. Als u geen constructor van de basisklasse specificeert in de initializer list, wordt de standaardconstructor van de superklasse automatisch aangeroepen.
Destructor van afgeleide klasse eerst
Wanneer een object wordt vernietigd, worden destructors aangeroepen in de omgekeerde volgorde van hun constructors. Dit betekent dat destructors eerst worden aangeroepen voor de meest afgeleide klasse, daarna voor elke basisklasse in omgekeerde volgorde van hun declaratie.
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; }
Pas nadat de destructor van de afgeleide klasse zijn opruimwerkzaamheden heeft voltooid, wordt de destructor van de basisklasse aangeroepen.
Bedankt voor je feedback!