析构函数执行时先调用派生类的析构函数,其次才调用基类的析构函数。如果析构函数不是虚函数,而程序执行时又要通过基类的指针去销毁派生类的动态对象,那么用delete销毁对象时,只调用了基类的析构函数,未调用派生类的析构函数。这样会造成销毁对象不完全。
#include<iostream.h>
#include<stdlib.h>
class CPerson
{
public:
protected:
};
class CStudent:public CPerson
{
public:
protected:
};
CPerson::~CPerson()
{
}
CStudent::~CStudent()
{
}
void main()
{
}
输出:
~Student!
~CPerson!
CStudent对象已经完成析构
~Student!
~CPerson!
如果去掉~CPerson()前面的virtual,且将“CStudent对象已经完成析构”改为“CStudent对象未完成析构”。程序的执行结果为:
~CPerson!
CStudent对象未完成析构
~Student!
~CPerson!
参考:http://359611946.blog.163.com/blog/static/1161900200976115331797/