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
Quizzes & Challenges
Quizzes
Challenges
/
C++ OOP

bookKonstruktor 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

main.cpp

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

main.cpp

main.cpp

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

main.cpp

copy
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
Observera

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 vid skapande och förstöring av ett objekt av en härledd klass?

Select the correct answer

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

Suggested prompts:

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?

bookKonstruktor 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

main.cpp

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

main.cpp

main.cpp

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

main.cpp

copy
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
Observera

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 vid skapande och förstöring av ett objekt av en härledd klass?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 4. Kapitel 4
some-alt