Потребность в виртуальных деструкторах обусловлена полиморфизмом. Если у вас есть что-то вроде следующего:
class A { ... };
class B : public A { ... };
void destroy_class(A* input)
{
delete input;
}
int main()
{
B* class_ptr = new B();
destroy_class(class_ptr); //you want the right destructor called
return 0;
}
Хотя это немного надуманный пример, когда вы удаляете переданный указатель для функции destroy_class()
, вы хотите, чтобы вызывался правильный деструктор. Если деструктор для class A
не был объявлен virtual
, то будет вызван только деструктор для class A
, а не деструктор для class B
или любой другой производный тип class A
.
Подобные вещи очень часто бывают фактом жизни с не шаблонными полиморфными структурами данных и т. Д., Где одной функции удаления, возможно, придется удалять указатели некоторого типа базового класса, который фактически указывает на объект производный тип.