Нет, вы никогда не называть Bese класса деструктор, он всегда вызывается автоматически, как другие указали, но здесь является доказательством концепции с результатами:
class base {
public:
base()
{
cout << __FUNCTION__ << endl;
}
~base()
{
cout << __FUNCTION__ << endl;
}
};
class derived : public base {
public:
derived()
{
cout << __FUNCTION__ << endl;
}
~derived()
{
cout << __FUNCTION__ << endl;
} // adding call to base::~base() here results in double call to base destructor
};
int main()
{
cout << "case 1, declared as local variable on stack" << endl << endl;
{
derived d1;
}
cout << endl << endl;
cout << "case 2, created using new, assigned to derive class" << endl << endl;
derived * d2 = new derived;
delete d2;
cout << endl << endl;
cout << "case 3, created with new, assigned to base class" << endl << endl;
base * d3 = new derived;
delete d3;
cout << endl;
return 0;
}
Выход:
case 1, declared as local variable on stack
base::base
derived::derived
derived::~derived
base::~base
case 2, created using new, assigned to derive class
base::base
derived::derived
derived::~derived
base::~base
case 3, created with new, assigned to base class
base::base
derived::derived
base::~base
Press any key to continue . . .
Если вы установили деструктор базового класса как виртуальный, то результаты будут такими же, как в случае 1 & 2.
Что относительно чистых виртуальных деструкторов? Мой компоновщик пытается вызвать его в конце не виртуального деструктора унаследованного класса; – cjcurrie
вы не можете иметь чистый виртуальный деструктор без тела. Просто дайте ему пустое тело. С помощью обычного чистого виртуального метода вместо него вызывается функция переопределения, с деструкторами, все они называются, поэтому вам нужно предоставить тело. Значение = 0 означает, что оно должно быть переопределено, поэтому все-таки полезная конструкция, если вам это нужно. –
Этот вопрос может быть связан и помочь [вопросы/15265106/c-a-missing-vtable-error] (http://stackoverflow.com/questions/15265106/c-a-missing-vtable-error). –