Konstruktor och Destruktor vid Arv
Basklassens konstruktor först
I samband med arv spelar konstruktorer en avgörande roll för att korrekt initiera härledda klasser. Förståelse för i vilken ordning konstruktorer anropas är avgörande för att greppa arvsdynamiken. Granska utdata från kodexemplet nedan för att se ordningen på konstruktorsanropen.
main.cpp
12345678910111213141516#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
123456789101112131415161718class Base { public: Base(int value) : data(value) {} private: int data; }; class Derived : public Base { public: Derived(int value) : Base(value) {} }; int main() { }
I exemplet anropas 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 destruktorerna anropas för den mest härledda klassen först, därefter för varje basklass i omvänd ordning mot deras deklaration.
main.cpp
12345678910111213141516#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!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal
Can you provide an example code snippet to illustrate this?
Why is it important for the base class constructor to run before the derived class constructor?
What happens if the base class doesn't have a default constructor?
Awesome!
Completion rate improved to 3.13
Konstruktor och Destruktor vid Arv
Svep för att visa menyn
Basklassens konstruktor först
I samband med arv spelar konstruktorer en avgörande roll för att korrekt initiera härledda klasser. Förståelse för i vilken ordning konstruktorer anropas är avgörande för att greppa arvsdynamiken. Granska utdata från kodexemplet nedan för att se ordningen på konstruktorsanropen.
main.cpp
12345678910111213141516#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
123456789101112131415161718class Base { public: Base(int value) : data(value) {} private: int data; }; class Derived : public Base { public: Derived(int value) : Base(value) {} }; int main() { }
I exemplet anropas 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 destruktorerna anropas för den mest härledda klassen först, därefter för varje basklass i omvänd ordning mot deras deklaration.
main.cpp
12345678910111213141516#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!