Я пытаюсь понять порядок, в котором конструкторы и деструкторы вызываются путем написания кода примера и попытки следовать потоку программы. В большинстве случаев я мог понять (с помощью Google, где это необходимо). Однако, в одном конкретном случае, я ударил немного дорожного блока.Порядок вызовов конструктора/деструктора при использовании наследования
Это программа Я использую:
#include <iostream>
class baseC
{
public:
baseC() { std::cout << "Calling constructor of base class: " << std::endl; }
virtual char const * getName(){ return "Base Class";}
~baseC(){ std::cout << "Calling destructor of base class: " << std::endl;}
};
class childC : public baseC
{
public:
childC() { std::cout << "Calling constructor of child class: " << std::endl; }
char const * getName(){ return "Child Class";}
~childC(){ std::cout << "Calling destructor of child class: " << std::endl; }
};
int main()
{
baseC c3 = childC();
std::cout << c3.getName() << std::endl;
}
Это выход я получаю:
$ g++ test_vd_se.cpp -o test; ./test
Calling constructor of base class:
Calling constructor of child class:
Calling destructor of child class:
Calling destructor of base class:
Base Class
Calling destructor of base class:
Компилятор кажется сначала создать базовый класс и класс ребенка (это, как ожидается,), однако он продолжает уничтожать оба класса, и тем не менее он может вызывать функцию-член из базового класса и продолжает уничтожать базовый класс еще раз.
Я был бы признателен, если бы кто-нибудь мог объяснить, почему функции вызываются в этом порядке.
Не забудьте объявить деструкторы базового класса как виртуальные. В противном случае удаление с помощью базового указателя не вызовет производные деструкторы. –
Самое любопытное, что мы не наблюдали * дважды * предложение 'Calling constructor базового класса:'. См. Мой ответ для объяснения. –