Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Costruttore e Distruttore nell'Ereditarietà | Panoramica sull'Ereditarietà
OOP in C++

book
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

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
Nota

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

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() { }

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

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
Nota

Solo dopo che il distruttore della Classe Derivata ha completato la sua pulizia, viene invocato il distruttore della Classe Base.

question mark

Qual è l'ordine corretto di chiamata di costruttori e distruttori durante la creazione e la distruzione di un oggetto di una classe derivata?

Select the correct answer

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 4. Capitolo 4

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

We use cookies to make your experience better!
some-alt