Konstruktø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
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; }
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
123456789101112131415161718class 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
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; }
Først når destruktoren for den afledte klasse har afsluttet sin oprydning, kaldes destruktoren for baseklassen.
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat
Awesome!
Completion rate improved to 3.13
Konstruktø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
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; }
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
123456789101112131415161718class 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
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; }
Først når destruktoren for den afledte klasse har afsluttet sin oprydning, kaldes destruktoren for baseklassen.
Tak for dine kommentarer!