Kursinnehåll
C++ OOP
C++ OOP
Konstruktor och Destruktor vid Arv
Basklassens konstruktor först
Inom arv spelar konstruktorer en avgörande roll för att korrekt initiera härledda klasser. Att förstå i vilken ordning konstruktorer anropas är avgörande för att förstå arvsdynamiken. Granska utdata från kodexemplet nedan för att se ordningen på konstruktorsanropen.
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 basklassens konstruktor har slutfört sin initiering, körs den härledda klassens konstruktor.
Superklassen anropas först eftersom den måste initiera de ärvda medlemmarna i subklassen. Detta säkerställer att subklassen startar i ett giltigt tillstånd och kan förlita sig på basklassens initierade tillstånd.
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 exemplet anropar du konstruktorn med parametrar i initieringslistan. Du måste uttryckligen anropa superklassens konstruktor inom initieringslistan för subklassens konstruktor. Om du inte anger en basklasskonstruktor i initieringslistan anropas standardkonstruktorn för superklassen automatiskt.
Härledd klassdestruktor först
När ett objekt förstörs anropas destruktorerna i omvänd ordning mot deras konstruktorer. Detta innebär att destruktorn för den mest härledda klassen anropas först, därefter för varje basklass i omvänd ordning mot deras 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 efter att destruktorn för härledd klass har slutfört sin städning anropas destruktorn för basklass.
Tack för dina kommentarer!