Costruttore e Distruttore nell'Ereditarietà
Prima il Costruttore della Classe Base
Nel contesto dell'ereditarietà, i costruttori svolgono un ruolo fondamentale nell'inizializzare correttamente le classi derivate. Comprendere la sequenza con cui vengono invocati i costruttori è essenziale per cogliere le dinamiche dell'ereditarietà. Osserva l'output del frammento di codice qui sotto per vedere l'ordine delle chiamate ai costruttori.
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; }
Una volta che il costruttore della Classe Base ha completato la sua inizializzazione, viene eseguito il costruttore della Classe Derivata.
La superclasse viene chiamata per prima perché deve inizializzare i membri ereditati della sottoclasse. Questo garantisce che la sottoclasse inizi con uno stato valido e possa fare affidamento sullo stato inizializzato della sua classe base.
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() { }
Nell'esempio, il costruttore viene chiamato con parametri nella lista di inizializzazione. È necessario chiamare esplicitamente il costruttore della superclasse all'interno della lista di inizializzazione del costruttore della sottoclasse. Se non si specifica un costruttore della classe base nella lista di inizializzazione, il costruttore di default della superclasse viene chiamato automaticamente.
Distruttore della Classe Derivata per Primo
Quando un oggetto viene distrutto, i distruttori vengono invocati nell'ordine inverso rispetto ai loro costruttori. Questo significa che i distruttori vengono chiamati prima per la classe più derivata, poi per ciascuna classe base in ordine inverso rispetto alla loro dichiarazione.
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; }
Solo dopo che il distruttore della Classe Derivata ha completato la sua pulizia, viene invocato il distruttore della Classe Base.
Grazie per i tuoi commenti!
Chieda ad AI
Chieda ad AI
Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione