| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 845 人关注过本帖
标题:为什么要将父类的析构函数定义成虚函数
只看楼主 加入收藏
魅影晓月
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2010-8-2
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:3 
为什么要将父类的析构函数定义成虚函数
如果直接delete子类对象,程序就会崩溃.....这到底是为什么?
搜索更多相关主题的帖子: 虚函数 
2011-06-19 21:33
Toomj
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:257
专家分:1826
注 册:2011-5-17
收藏
得分:10 
不需要将父类的析构函数定义成虚函数啊
当派生类析构时,先调用派生类析构函数清理派生类新增成员,再调用派生类成员对象析构函数清理派生类新增的成员对象,最后调用基类析构函数清理从基类继承来的基类子对象。
2011-06-20 00:11
duliningmiss
Rank: 2
等 级:论坛游民
帖 子:20
专家分:79
注 册:2011-6-10
收藏
得分:10 
多态的时候一定要将析构函数写成虚函数,防止内存泄露,各个子类维护自己内部数据释放。
2011-06-20 16:45
duliningmiss
Rank: 2
等 级:论坛游民
帖 子:20
专家分:79
注 册:2011-6-10
收藏
得分:0 
给你举个例子,帮助理解吧
#include <iostream.h>   
class Base   
{   
public:   
Base() { mPtr = new int; }   
~Base() { delete mPtr; cout<<"Base::Destruction"<<endl;}   
private:   
  int* mPtr;   
} ;   
  
class Derived : public Base   
{   
public:   
   Derived() { mDerived = new long; }   
   ~Derived() { delete mDerived; cout<<"Derived::Destruction"<<endl;}   
private:   
  long* mDerived;   
} ;   
  
void main()   
{   
   Base* p = new Derived;   
  delete p;   
}   

输出结果只有:Base::Destruction
以上代码会产生内存泄露,因为new出来的是Derived类资源,采用一个基类的指针来接收,析构的时候,编译器因为只是知道这个指针是基类的,所以只将基类部分的内存析构了,而不会析构子类的,就造成了内存泄露,如果将基类的析构函数改成虚函数,就可以避免这种情况,因为虚函数是后绑定,其实就是在虚函数列表中,析构函数将基类的析构函数用实际对象的一组析构函数替换掉了,也就是先执行子类的虚函数再执行父类的虚函数,这样子类的内存析构了,父类的内存也释放了,就不会产生内存泄露。
注:
1.析构函数其实是一个函数,不论子类还是父类,虽然可能看起来名字不一样。而且析构函数执行过程都是执行子类再到父类。
2.多态的时候一定要将析构函数写成虚函数,防止内存泄露,各个子类维护自己内部数据释放。
收到的鲜花
  • 乐乐牛2011-07-11 00:16 送鲜花  3朵   附言:我似乎明白点了,,,谢谢
2011-06-20 16:46
快速回复:为什么要将父类的析构函数定义成虚函数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016630 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved