菜鸟成长之虚析构函数
2011-10-20 09:55
363 查看
如果一个类需要作为其他类的父类,则需要把该类的析构函数设置为虚函数。下面以一个例子来说明必要性。
#include<iostream>
using namespace std;
class Base
{
public:
virtual ~Base()
{
cout<<"Base destruction"<<endl;
}
};
class Derived:public Base
{
public:
~Derived()
{
cout<<"Derived destruction"<<endl;
}
};
int main()
{
Base *pb=new Derived();
delete pb;
return 0;
}
如果父类的析构函数不是虚函数,而且使用了new运算符在堆上动态的分配了该子类的对象,如果使用delete运算符删除该对象,则不会调用子类的析构函数。如果在子类中动态的分配了内存,则会出现内存泄漏的情况。但是如果将父类的析构函数设置为虚函数,则子类的虚构函数会被调用。在例子中如果删除virtual,则只会打印Base destruction。如果加上virtual则会先打印Derived destruction,再打印Base destruction。
如果使用子类的指针指向该对象,并调用delete则不会出现这种情况。
#include<iostream>
using namespace std;
class Base
{
public:
virtual ~Base()
{
cout<<"Base destruction"<<endl;
}
};
class Derived:public Base
{
public:
~Derived()
{
cout<<"Derived destruction"<<endl;
}
};
int main()
{
Base *pb=new Derived();
delete pb;
return 0;
}
如果父类的析构函数不是虚函数,而且使用了new运算符在堆上动态的分配了该子类的对象,如果使用delete运算符删除该对象,则不会调用子类的析构函数。如果在子类中动态的分配了内存,则会出现内存泄漏的情况。但是如果将父类的析构函数设置为虚函数,则子类的虚构函数会被调用。在例子中如果删除virtual,则只会打印Base destruction。如果加上virtual则会先打印Derived destruction,再打印Base destruction。
如果使用子类的指针指向该对象,并调用delete则不会出现这种情况。
相关文章推荐
- Android菜鸟在成长-日期对话框:DatePickerDialog
- 如何从菜鸟成长为(伪)架构师
- 菜鸟成长记-UICollectionView使用
- SQL基本语句解析数据库的理解——菜鸟的成长之路!
- 菜鸟成长记-UILabel使用、横线划掉价格
- 菜鸟成长记-初探Swift
- Android菜鸟的成长笔记(25)——可爱的小闹钟
- 菜鸟的成长之路——控制反转和注入依赖
- 菜鸟网络工程师的成长笔记——第15天(2016.09.01)
- 菜鸟的成长之路——ftp的上传和下载
- [置顶] 一个菜鸟java码农的成长之路(5):如何获取10个1-20的随机数,要求不能重复
- 记录小菜鸟的我的每一次成长
- 菜鸟初成长
- iOS菜鸟成长笔记(1)——第一个iOS应用
- 嵌入式系统成功之道-菜鸟成长日记感想
- 菜鸟的成长——第一个项目的感悟
- 前端菜鸟的成长学习之路(二)
- 菜鸟成长之汉诺塔
- 编码 GBK 的不可映射字符——【java菜鸟成长记】
- <转>我对菜鸟成长的看法