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
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; }
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
123456789101112131415161718class 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
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; }
Somente após o destrutor da Classe Derivada concluir sua limpeza, o destrutor da Classe Base é invocado.
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
Can you provide an example code snippet to illustrate this?
Why is it important for the base class constructor to run before the derived class constructor?
What happens if the base class doesn't have a default constructor?
Awesome!
Completion rate improved to 3.13
Construtor e Destrutor em Herança
Deslize para mostrar o menu
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
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; }
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
123456789101112131415161718class 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
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; }
Somente após o destrutor da Classe Derivada concluir sua limpeza, o destrutor da Classe Base é invocado.
Obrigado pelo seu feedback!