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

Konstruktør og Destruktør i Arv

Sveip for å vise menyen

Basisklassekonstruktør først

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

main.cpp

main.cpp

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 basisklasse-konstruktøren har fullført sin initialisering, blir avledet klasse-konstruktøren utført.

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

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 eksempelet 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 deres konstruktører. Dette betyr at destruktøren for den mest avledede klassen kalles først, deretter for hver baseklasse i motsatt rekkefølge av deres deklarasjon.

main.cpp

main.cpp

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 oppryddingen, blir destruktøren for baseklasse 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?

Velg det helt riktige svaret

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

Seksjon 4. Kapittel 4
some-alt