Я понимаю, что если мы хотим вызвать деструктор нашего производного объекта, который был назначен указателю на базу, мы хотим сделать базовый деструктор как виртуальным. Однако, если у нас было что-то вроде этого:Virtual Destructor C++
#include <iostream>
using namespace std;
class base
{
public:
base() { cout << "Base Constructor Called\n"; }
virtual ~base() { cout << "Base Destructor called\n"; }
};
class derived1 :public base
{
public:
derived1() { cout << "Derived1 constructor called\n"; }
~derived1() { cout << "Derived1 destructor called\n"; }
};
class derived2 : public derived1
{
public:
derived2() { cout << "Derived2 constructor called\n"; }
~derived2() { cout << "Derived2 destructor called\n"; }
};
class derived3 : public derived2
{
public:
derived3() { cout << "Derived3 constructor called\n"; }
~derived3() { cout << "Derived3 destructor called\n"; }
};
и мы имеем главную функцию:
int main(){
base* ptr=new derived3;
delete ptr;
и выход:
Base Constructor Called Derived1 constructor called Derived2 constructor called Derived3 constructor called Derived3 destructor called Derived2 destructor called Derived1 destructor called Base Destructor called
это вызывает базу, Derived1, производные2 и производные3 деструкторы, которые работают отлично. мы только сделали базовый деструктор виртуальным.
Почему нет необходимости создавать производные 1 и 2 деструкторы как виртуальные для получения одинаковых результатов?
Я [отправил этот ответ] (http://stackoverflow.com/a/36760987/440558) всего пару часов назад с кавычками из спецификации C++, в которой говорится, почему он не нужен для дочерних классов. Последняя цитата - та, которую вы должны прочитать. То же самое относится к * всем * функциям-членам, если базовый класс объявляет его виртуальным, тогда он также является виртуальным во всех дочерних классах. –