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

book
Konstruktør og Destruktør i Arv

Basisklassens konstruktør først

I sammenheng med arv spiller konstruktører en avgjørende rolle for å initialisere avledede klasser korrekt. Å forstå rekkefølgen konstruktører kalles i er nøkkelen til å forstå dynamikken i arv. Se på utdataene fra kodeeksemplet nedenfor for å se rekkefølgen på konstruktørkallene.

main.cpp

main.cpp

copy
#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;
}
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
Merk

Når basisklassens konstruktør har fullført sin initialisering, kjøres konstruktøren til den avledede klassen.

Superklassen kalles først fordi den må initialisere de arvede medlemmene til subklassen. Dette sikrer at subklassen starter med en gyldig tilstand og kan stole på den initialiserte tilstanden til sin baseklasse.

main.cpp

main.cpp

copy
class Base {
public:
Base(int value)
: data(value) {}
private:
int data;
};

class Derived : public Base {
public:
Derived(int value)
: Base(value) {}
};

int main()
{

}
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 kaller du konstruktøren med parametere i initialiseringslisten. Du må eksplisitt kalle superklassens konstruktør innenfor initialiseringslisten til subklassens konstruktør. Hvis du ikke spesifiserer en baseklassekonstruktør i initialiseringslisten, kalles standardkonstruktøren til superklassen automatisk.

Destruktør for avledet klasse først

Når et objekt blir ødelagt, blir destruktører kalt i motsatt rekkefølge av sine konstruktører. Dette betyr at destruktører kalles for den mest avledede klassen først, deretter for hver baseklasse i motsatt rekkefølge av deres deklarasjon.

main.cpp

main.cpp

copy
#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;
}
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
Merk

Først etter at destruktøren for avledet klasse har fullført sin opprydding, blir destruktøren for baseklassen kalt.

question mark

Hva er riktig rekkefølge for kall av konstruktører og destruktører når et objekt av en avledet klasse opprettes og destrueres?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 4. Kapittel 4

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

some-alt