析构函数定义为虚函数
2013-12-05 11:41
429 查看
析构函数执行时先调用派生类的析构函数,其次才调用基类的析构函数。如果析构函数不是虚函数,而程序执行时又要通过基类的指针去销毁派生类的动态对象,那么用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!
参考:http://359611946.blog.163.com/blog/static/1161900200976115331797/
#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!
参考:http://359611946.blog.163.com/blog/static/1161900200976115331797/
相关文章推荐
- adobe flash开发应用界面|炫
- PHP笔记(1) 显示
- hive 元数据升级
- stm32关于BOOT0和BOOT1设置
- ArcGIS Desktop开发框架快速搭建【一】
- 比特币淘金热席卷中国专业“挖矿机”受疯抢
- VS环境中,cmake出来的ALL_BUILD项目和 ZERO_CHECK项目的作用
- 【用jQuery来判断浏览器的类型】及【javascript获取用户ip地址】
- 比特币淘金热席卷中国专业“挖矿机”受疯抢
- make、make clean、make install、make uninstall、make dist、make distcheck和make distclean
- 日期
- make、make clean、make install、make uninstall、make dist、make distcheck和make distclean
- make、make clean、make install、make uninstall、make dist、make distcheck和make distclean
- ICCV 2013 Accepted Tutorials
- 电话本-----添加错误命令处理
- Python中的sin和cos函数
- Chrome RenderText分析(2)
- 关于手机rom、ram、internal storage的问题?
- android根据包名构建第三方应用的上下文Context
- 串口中rts/cts