class B
{
public:
B()
{
p = new int[1024];
}
virtual ~B()
{
cout<<"B destructor"<<endl;
//p will not be deleted EVER unless you do it manually.
}
int *p;
};
class D : public B
{
public:
virtual ~D()
{
cout<<"D destructor"<<endl;
}
};
Когда вы выполните:
B *pD = new D();
delete pD;
Деструктор будет вызываться, только если ваш базовый класс имеет ключевое слово virtual.
Тогда, если у вас не было виртуального деструктора, вызывается только ~ B (). Но поскольку у вас есть виртуальный деструктор, вызывается первая ~ D (), а затем ~ B ().
Никакие члены B или D, выделенные в куче, не будут освобождены, если вы их явно не удалите. И удаление их также вызовет их деструктор.