Conteúdo do Curso
C++ Poo
C++ Poo
Construtor e Destrutor em Herança
Construtor da Classe Base Primeiro
No contexto de herança, os construtores desempenham um papel fundamental na correta inicialização das classes derivadas. Compreender a ordem em que os construtores são chamados é essencial para entender a dinâmica da herança. Observe a saída do trecho de código abaixo para ver a ordem das chamadas dos construtores.
main.cpp
#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; }
Após a conclusão da inicialização pelo construtor da Classe Base, o construtor da Classe Derivada é executado.
A superclasse é chamada primeiro porque precisa inicializar os membros herdados da subclasse. Isso garante que a subclasse comece com um estado válido e possa depender do estado inicializado de sua classe base.
main.cpp
class Base { public: Base(int value) : data(value) {} private: int data; }; class Derived : public Base { public: Derived(int value) : Base(value) {} }; int main() { }
No exemplo, o construtor é chamado com parâmetros na lista de inicialização. É necessário chamar explicitamente o construtor da superclasse dentro da lista de inicialização do construtor da subclasse. Se não especificar um construtor da classe base na lista de inicialização, o construtor padrão da superclasse será chamado automaticamente.
Destrutor da Classe Derivada Primeiro
Quando um objeto é destruído, os destrutores são invocados na ordem inversa de seus construtores. Isso significa que os destrutores são chamados primeiro para a classe mais derivada e, em seguida, para cada classe base na ordem inversa de sua declaração.
main.cpp
#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; }
Somente após o destrutor da Classe Derivada concluir sua limpeza, o destrutor da Classe Base é invocado.
Obrigado pelo seu feedback!