析构函数执行时先调用派生类的析构函数,其次才调用基类的析构函数。如果析构函数不是虚函数,而程序执行时又要通过基类的指针去销毁派生类的动态对象,那么用delete销毁对象时,只调用了基类的析构函数,未调用派生类的析构函数。这样会造成销毁对象不完全。
#include<iostream.h>
#include<stdlib.h>
class CPerson
{
public:
virtual ~CPerson(); //基类的析构函数必须声明为虚函数,否则
用delete销毁对象时会出错
protected:
char * m_lpszName;
char * m_lpszSex;
};
class CStudent:public CPerson
{
public:
~CStudent(); //virtual可加也可不加
protected:
int m_iNumjber; //学号
};
CPerson::~CPerson()
{
cout<<"~CPerson!"<<endl;
}
CStudent::~CStudent()
{
cout<<"~CStudent!"<<endl;
}
void main()
{
CPerson * poCPerson = new CStudent; //构造一个CStudent的动态对象
if(NULL==poCPerson)
{
exit(0);
}
delete poCPerson;
cout<<"CStudent对象已经完成析构"<<endl; //如果析构函数是非虚函数,
那么CStudent对象就未析构完
CStudent oCStudent;
}
输出:
~Student!
~CPerson!
CStudent对象已经完成析构
~Student!
~CPerson!
如果去掉~CPerson()前面的virtual,且将“CStudent对象已经完成析构”改为“CStudent对象未完成析构”。程序的执行结果为:
~CPerson!
CStudent对象未完成析构
~Student!
~CPerson!
时间: 2024-11-05 23:24:53