Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Konstruktør og Destruktor i Arv | Oversigt over Arv
Quizzes & Challenges
Quizzes
Challenges
/
C++ OOP

bookKonstruktør og Destruktor i Arv

Basisklassens konstruktør først

I forbindelse med arv spiller konstruktører en afgørende rolle i korrekt initialisering af afledte klasser. Forståelse af rækkefølgen, hvori konstruktører kaldes, er nøglen til at forstå arvens dynamik. Se på outputtet fra kodeeksemplet nedenfor for at se rækkefølgen af konstruktørkald.

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
Bemærk

Når basisklassens konstruktør har fuldført sin initialisering, udføres afledt klasses konstruktør.

Superklassen kaldes først, fordi den skal initialisere de nedarvede medlemmer af subklassen. Dette sikrer, at subklassen starter i en gyldig tilstand og kan stole på den initialiserede tilstand fra sin basisklasse.

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 eksemplet kaldes konstruktøren med parametre i initialiseringslisten. Du skal eksplicit kalde superklassens konstruktør inden for initialiseringslisten i subklassens konstruktør. Hvis du ikke angiver en basisklassekonstruktør i initialiseringslisten, kaldes standardkonstruktøren for superklassen automatisk.

Afledt klasses destruktor først

Når et objekt destrueres, kaldes destruktorerne i omvendt rækkefølge af deres konstruktører. Det betyder, at destruktoren for den mest afledte klasse kaldes først, derefter for hver baseklasse i omvendt rækkefølge af deres 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
Bemærk

Først når destruktoren for den afledte klasse har afsluttet sin oprydning, kaldes destruktoren for baseklassen.

question mark

Hvad er den korrekte rækkefølge for kald af konstruktører og destruktører ved oprettelse og destruktion af et objekt af en afledt klasse?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 4. Kapitel 4

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

bookKonstruktør og Destruktor i Arv

Stryg for at vise menuen

Basisklassens konstruktør først

I forbindelse med arv spiller konstruktører en afgørende rolle i korrekt initialisering af afledte klasser. Forståelse af rækkefølgen, hvori konstruktører kaldes, er nøglen til at forstå arvens dynamik. Se på outputtet fra kodeeksemplet nedenfor for at se rækkefølgen af konstruktørkald.

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
Bemærk

Når basisklassens konstruktør har fuldført sin initialisering, udføres afledt klasses konstruktør.

Superklassen kaldes først, fordi den skal initialisere de nedarvede medlemmer af subklassen. Dette sikrer, at subklassen starter i en gyldig tilstand og kan stole på den initialiserede tilstand fra sin basisklasse.

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 eksemplet kaldes konstruktøren med parametre i initialiseringslisten. Du skal eksplicit kalde superklassens konstruktør inden for initialiseringslisten i subklassens konstruktør. Hvis du ikke angiver en basisklassekonstruktør i initialiseringslisten, kaldes standardkonstruktøren for superklassen automatisk.

Afledt klasses destruktor først

Når et objekt destrueres, kaldes destruktorerne i omvendt rækkefølge af deres konstruktører. Det betyder, at destruktoren for den mest afledte klasse kaldes først, derefter for hver baseklasse i omvendt rækkefølge af deres 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
Bemærk

Først når destruktoren for den afledte klasse har afsluttet sin oprydning, kaldes destruktoren for baseklassen.

question mark

Hvad er den korrekte rækkefølge for kald af konstruktører og destruktører ved oprettelse og destruktion af et objekt af en afledt klasse?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 4. Kapitel 4
some-alt