Я думаю, что ядро этого вопроса касается виртуальных методов и полиморфизма, а не деструктора. Вот более ясный пример:
class A
{
public:
A() {}
virtual void foo()
{
cout << "This is A." << endl;
}
};
class B : public A
{
public:
B() {}
void foo()
{
cout << "This is B." << endl;
}
};
int main(int argc, char* argv[])
{
A *a = new B();
a->foo();
if(a != NULL)
delete a;
return 0;
}
Будет распечатан:
This is B.
Без virtual
он распечатает:
This is A.
И теперь вы должны понимать, когда использовать виртуальные деструкторы.