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
C++ OOP
course content

Kursusindhold

C++ OOP

C++ OOP

1. Grundlæggende OOP i C++
2. Konstruktører og Destruktører
3. Oversigt Over Indkapsling
4. Oversigt over Arv
5. Oversigt Over Polymorfi

book
Konstruktør og Destruktor i Arv

Base Class-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 Base Class-konstruktøren har fuldført sin initialisering, udføres Derived Class-konstruktøren.

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 dens 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 afledt klasse har afsluttet sin oprydning, kaldes destruktoren for baseklasse.

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

course content

Kursusindhold

C++ OOP

C++ OOP

1. Grundlæggende OOP i C++
2. Konstruktører og Destruktører
3. Oversigt Over Indkapsling
4. Oversigt over Arv
5. Oversigt Over Polymorfi

book
Konstruktør og Destruktor i Arv

Base Class-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 Base Class-konstruktøren har fuldført sin initialisering, udføres Derived Class-konstruktøren.

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 dens 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 afledt klasse har afsluttet sin oprydning, kaldes destruktoren for baseklasse.

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