#include<iostream>
using std::cout;
using std::endl;
class Base{
public:
virtual ~Base(){cout<<"~B"<<endl;}
};
class Derived:public Base{
public:
virtual ~Derived(){cout<<"~D"<<endl;}
};
void main (){
Base *b=new Derived();
delete b;
}
//执行结果
~D
~B
//解释
沿着程序执行流程,从main函数进入
首先,执行语句Base *b=new Derived();
结果是在堆中创建类Derived的一个对象,并且让类型为Base *的指针b指向这个对象;
其次,执行语句delete b;
运行结果是释放b指向对象的内存空间。按照C++的delete操作符的语义,编译器会调用指针b“对应类型”的对象的析构函数,但是由于类Base的析构函数声明为虚函数,因此实现方式具有多态特征,因此运行时调用的析构函数是Derived::~Derived()。
第三,子类的析构函数Derived::~Derived()内部会调用父类的析构函数。