Kursusindhold
C++ OOP
C++ OOP
Konstruktør og Destruktor i Arv
Base Class-konstruktør først
I forbindelse med arv spiller konstruktører en afgørende rolle i korrekt initialisering af afledte klasser. Forståelse af rækkefølgen, hvori konstruktører kaldes, er nøglen til at forstå arvens dynamik. Se på outputtet fra kodeeksemplet nedenfor for at se rækkefølgen af konstruktørkald.
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; }
Når Base Class-konstruktøren har fuldført sin initialisering, udføres Derived Class-konstruktøren.
Superklassen kaldes først, fordi den skal initialisere de nedarvede medlemmer af subklassen. Dette sikrer, at subklassen starter i en gyldig tilstand og kan stole på den initialiserede tilstand fra dens 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() { }
I eksemplet kaldes konstruktøren med parametre i initialiseringslisten. Du skal eksplicit kalde superklassens konstruktør inden for initialiseringslisten i subklassens konstruktør. Hvis du ikke angiver en basisklassekonstruktør i initialiseringslisten, kaldes standardkonstruktøren for superklassen automatisk.
Afledt klasses destruktor først
Når et objekt destrueres, kaldes destruktorerne i omvendt rækkefølge af deres konstruktører. Det betyder, at destruktoren for den mest afledte klasse kaldes først, derefter for hver baseklasse i omvendt rækkefølge af deres deklaration.
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; }
Først når destruktoren for afledt klasse har afsluttet sin oprydning, kaldes destruktoren for baseklasse.
Tak for dine kommentarer!