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
course content

Kursinnehåll

C++ OOP

C++ OOP

1. Grunderna i OOP i C++
2. Konstruktorer och Destruktorer
3. Översikt Av Inkapsling
4. Översikt av Arv
5. Översikt av Polymorfism

book
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

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
Observera

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

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

course content

Kursinnehåll

C++ OOP

C++ OOP

1. Grunderna i OOP i C++
2. Konstruktorer och Destruktorer
3. Översikt Av Inkapsling
4. Översikt av Arv
5. Översikt av Polymorfism

book
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

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
Observera

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

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