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