寒星轩

There are innumerable stars in the sky, the smallest is me!

用户操作
[即时聊天] [发私信] [加为好友]
李星ID:starlee
207922次访问,排名342(1)好友65人,关注者107
欢迎大家访问我的Blog。
主要是C++,设计模式,面向对象设计方面的技术文章。
starlee的文章
原创 98 篇
翻译 0 篇
转载 45 篇
评论 331 篇
李星的公告
郑重声明

        本BLOG所发表的 原创文章,作者保留一切权利。必须经过作者本人同意后方可转载,并注名作者(StarLee)和出处(CSDN Blog)。
作者Email:
coolstarlee(at)sohu.com
最近评论
陈诚:好象不一样,我这个共两个类,实现类和接口类
深夜才走在路上:实际上使用CLR封送C++类让人很受伤,在mc中有很多C++的特性不能使用,甚至STL都不可用
hfg :错了错了,当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用。

不管基类的析构函数是不是virtual ,派生类的析构函数还是会被调用的,区别只是在于基类的析构函数有没有被调用
Forrest Yu:Star Lee:

如果有两个以上的类需要包装,那又应该怎样做呢?
Forrest Yu:CLR 还是很强大的,
一些老的MFC项目可以先手动添加
#include <afx.h>,
其他的可能要加
#include <windows.h>,
然后再用这种方法.
文章分类
收藏
相册
友情链接
houdy的专栏
lijgame的专栏
lyrebing的专栏
禾青谷
存档
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

原创 C++中虚析构函数的作用收藏

新一篇: C++中禁止类被派生的方法 | 旧一篇: 今天我的文章从CSDN首页上消失了

    我们知道,用C++开发的时候,用来做基类的类的析构函数一般都是虚函数。可是,为什么要这样做呢?下面用一个小例子来说明:    
    有下面的两个类:

class ClxBase
{
public:
    ClxBase() {};
    
virtual ~ClxBase() {};

    
virtual void DoSomething() { cout << "Do something in class ClxBase!" << endl; };
};

class ClxDerived : public ClxBase
{
public:
    ClxDerived() {};
    
~ClxDerived() { cout << "Output from the destructor of class ClxDerived!" << endl; }; 

    
void DoSomething() { cout << "Do something in class ClxDerived!" << endl; };
};

    代码

ClxBase *pTest = new ClxDerived;
pTest
->DoSomething();
delete pTest;

    的输出结果是:

Do something in class ClxDerived!
Output from the destructor of class ClxDerived!

    这个很简单,非常好理解。
    但是,如果把类ClxBase析构函数前的virtual去掉,那输出结果就是下面的样子了:

Do something in class ClxDerived!

    也就是说,类ClxDerived的析构函数根本没有被调用!一般情况下类的析构函数里面都是释放内存资源,而析构函数不被调用的话就会造成内存泄漏。我想所有的C++程序员都知道这样的危险性。当然,如果在析构函数中做了其他工作的话,那你的所有努力也都是白费力气。
    所以,文章开头的那个问题的答案就是--这样做是为了当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用。
    当然,并不是要把所有类的析构函数都写成虚函数。因为当类里面有虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,这样就会增加类的存储空间。所以,只有当一个类被用来作为基类的时候,才把析构函数写成虚函数。

发表于 @ 2006年03月09日 15:34:00|评论(loading...)|编辑

新一篇: C++中禁止类被派生的方法 | 旧一篇: 今天我的文章从CSDN首页上消失了

评论

#cdlgz 发表于2006-07-13 16:49:00  IP: 218.104.205.*
好,顶一下
#blackbeetle 发表于2006-08-04 11:02:00  IP: 60.176.4.*
常识
#dynuaa 发表于2006-08-11 21:43:00  IP: 218.2.240.*
知道的人知道是常识,但是我知道有太多的人不知道为什么要用以及何时用虚拟析构函数。
#jxlczjp77 发表于2007-06-08 12:25:42  IP: 222.68.182.*
---------------------------------------------------------------------
“只有当一个类被用来作为基类的时候,才把析构函数写成虚函数。”
--------------------------------------------------------------------

请问如果派生类没有资源需要释放的时侯,是否可以将基类的 Virtual 去掉?毕竟Virtual需要一个额外的虚函数表
2007-06-11 15:57:30作者回复
我觉得只有在派生类的析构函数为空的时候,才可以将基类析构函数的virtual去掉。因为基类的析构函数不为virtual的话,如果出现上文例子中那样的情况,派生类的析构函数不会被调用,那么写在派生类析构函数中的代码就不会被执行!我想这也不是程序员希望看到的。
#sfsfs 发表于2007-07-07 14:28:22  IP: 219.148.40.*
当你真正理解构造函数的时候,一定会知道 析构函数的virtual的取舍!
#顶 发表于2007-08-15 15:16:18  IP: 219.134.251.*
见着你的照片,还觉得人不错。。。只是照片上的红色大字怎么看也不顺眼,
2007-08-15 16:10:14作者回复
以前还真没发现!你这么一说,还真觉得有点儿扎眼。现在已经改成黑色了。呵呵~~
#danyajuan 发表于2007-10-29 21:16:28  IP: 218.2.216.*
学习中。
楼主是个帅哥哦^_^
#longyn 发表于2007-11-20 18:48:54  IP: 218.6.135.*
我运行出来的结果怎么和LZ说的不一样~~~~~~~`
clxBase有virtual的时候,我的输出结果:
Do something in class ClxDerived!
Output from the destructor of class ClxDerived!
clxBase没有virtual的时候,输出结果:
Do something in class ClxBase!
Output from the destructor of class ClxDerived!
2007-11-21 08:58:26作者回复
呵呵~~不知道你用的代码是否完全跟我文章中一样?C++中虚析构函数的作用就是删除一个指向派生类的基类指针的时候派生类的析构函数会被调用。任何符合C++标准的编译器编译出文章中的代码后的输出结果应该都是一样的。
#fengzi_shen 发表于2007-12-07 10:08:43  IP: 60.176.36.*
lz代码是不是好像不规范?
在类里面函数写完了大括号后面好像不用加分号的吧
#evoup1 发表于2007-12-24 00:52:14  IP: 58.39.216.*
很好,看了学校的教材,忽略了这种情况,实际上都是这么写的,这下明白了。
#blz_wowar 发表于2008-01-10 09:09:45  IP: 218.75.42.*
基类的析构函数不一定是虚函数,
若是这种写法

ClxDerived a;
a.DoSomething();

函数执行完毕,那不管基类析构函数是不是虚函数,都会被执行到,但是若用到指针就一定需要virtual了,其实看实际运用的取舍。
但是若真的要被继承,还是加了好,我想用到指针真的是很频繁的情况。

BTW:看来我真要去好好学习学习C/C++的一些基础了,忘记的差不多了,汗~~~
#devil_zuiai 发表于2008-02-29 08:44:27  IP: 10.167.133.*
又加深了对这个的映像。
#yrnaaa 发表于2008-04-26 16:35:46  IP: 123.120.4.*
学习了 谢谢
#hfg  发表于2008-09-17 14:00:26  IP: 122.224.161.*
错了错了,当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用。

不管基类的析构函数是不是virtual ,派生类的析构函数还是会被调用的,区别只是在于基类的析构函数有没有被调用
2008-09-18 09:22:44作者回复
没有错!你可以把文章中的代码拷贝下来编译一下,看输出结果就知道了。
发表评论  


登录
Csdn Blog version 3.1a
Copyright © 李星