C++虚析构函数
来源:互联网 发布:黑米软件怎么样 编辑:程序博客网 时间:2024/06/05 10:41
在用C++编写类的时候,我们通常把析构函数声明为虚函数,这是为什么呢?我们看一下这样的两个类:
#include <iostream>#include<stdio.h>using namespace std;//父类class CBase{public://构造函数CBase(){cout<<"Create CBase"<<endl;}//析构函数~CBase(){cout<<"Destruct CBase"<<endl;}};//子类class CChild:public CBase{public://构造函数CChild(){cout<<"Create Child"<<endl;}//析构函数~CChild(){cout<<"Destruct CChild"<<endl;}};
这里,CChild类public继承于CBase类,如果我们从CChild类来定义一个CBase类,采用动态分配内存的方式,如下所示:
void main(){CBase *b=new CChild();//进行一些操作。。。/*省略*/delete b;getchar();}
运行结果如下:
可见,这里并没有‘遵循“一般的父子类继承机制,因为从表面上看,在释放对象时,只是对父类进行了释放,但是没有调用子类的析构函数。这种情况就会造成内存泄露的问题。我们知道,在公有继承中,基类对派生类及其对象的操作,只能影响到那些从基类继承下来的成员,如果想要用基类对非继承成员进行操作,则要把基类的这个函数定义为虚函数。.析构函数自然也应该如此,如果它想析构子类中的重新定义或新的成员及对象,当然也应该声明为虚的。
我们把CBase类的析构函数指定为虚函数,再看看运行结果。
#include <iostream>#include<stdio.h>using namespace std;//父类class CBase{public://构造函数CBase(){cout<<"Create CBase"<<endl;}//析构函数 virtual ~CBase(){cout<<"Destruct CBase"<<endl;}};//子类class CChild:public CBase{public://构造函数CChild(){cout<<"Create Child"<<endl;}//析构函数~CChild(){cout<<"Destruct CChild"<<endl;}};
运行结果如下:
可见,当父类的析构函数声明为虚函数时,就达到了调用子类析构函数的目的。所以我们在定义类的时候,为了防止发生内存泄漏,最好把其析构函数声明为虚函数。
0 0
- C++-----虚析构函数
- C++----虚析构函数
- C++【浅谈虚析构函数】
- C++_虚析构函数
- 【c++】虚析构函数
- (C++)虚析构函数
- C++---------之--------【虚析构函数】
- 【C/C++】C++虚析构函数的作用
- [C/C++]C函数
- 【C++】正确使用虚析构函数
- c++------------之---【虚析构函数应用】
- <C++>析构函数、虚析构函数和构造函数
- c 函数
- C函数
- C 函数
- C函数
- 【C++】函数
- C 函数
- JAVA泛型理解
- 浅谈MySQL备份字符集的问题
- 项目管理
- Sicily 周赛 Opening Ceremony
- (7)设计模式:bridge
- C++虚析构函数
- LeetCode - Permutation Sequence
- 线程池服务端设计
- C++中的vector使用范例
- openfire 搭建数据库的配置问题
- Sicily周赛 Clock Pictures
- vector是一个十分有用的容器
- Twisted: 用 getPage 完成 POST 操作
- python3嵌入mysql实现简易交互界面