Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Konstruktor och destruktor vid arv | Översikt av arv
C++ OOP

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 förstå arvsdynamiken. Titta på utdata från kodexemplet nedan för att se ordningen på konstruktorsanropen.

main.cpp

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; }
Note
Notera

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 börjar i ett giltigt tillstånd och kan förlita sig på basklassens initierade tillstånd.

main.cpp

main.cpp

123456789101112131415161718
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 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 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

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; }
Note
Notera

Först efter att destruktorn för härledd klass har slutfört sin städning anropas destruktorn för basklass.

question mark

Vilken är den korrekta ordningen för anrop av konstruktorer och destruktorer när ett objekt av en härledd klass skapas och förstörs?

Vänligen välj det korrekta svaret

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 4. Kapitel 4

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

Avsnitt 4. Kapitel 4
some-alt