社区
新手乐园
帖子详情
关于虚析构函数,高手指教
Paris_Luo
2004-09-12 11:12:00
有的书上说,当有个静态类型为基类的指针实际指向了派生类的对象时,就必须给基类添加虚析构函数,为什么?
...全文
164
6
打赏
收藏
关于虚析构函数,高手指教
有的书上说,当有个静态类型为基类的指针实际指向了派生类的对象时,就必须给基类添加虚析构函数,为什么?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
6 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
myling
2004-09-12
打赏
举报
回复
不要被析构两个字迷惑了
他还是个虚函数
Maxwell
2004-09-12
打赏
举报
回复
因为派生类的析构函数需要执行的功能可不见得跟基类的析构函数一样,如果析构函数不是虚的,那用基类指针释放派生类对象时就会调用基类的析构函数。所以就需要有虚析构函数。
蒋晟
2004-09-12
打赏
举报
回复
为什么析构函数总是虚函数?如果这是必要的,那么为什么C++不把虚析构函数直接作为默认值?为什么纯虚析构函数可以通过编译,但是不能通过连接?
回答:
编译器总是根据类型来调用类成员函数。但是一个派生类的指针可以安全地转化为一个基类的指针。这样删除一个基类的指针的时候,C++不管这个指针指向一个基类对象还是一个派生类的对象,调用的都是基类的析构函数而不是派生类的。如果你依赖于派生类的析构函数的代码来释放资源,而没有重载析构函数,那么会有资源泄漏。
所以建议的方式是将析构函数声明为虚函数。如果你使用MFC,并且以CObject或其派生类为基类,那么MFC已经为你做了这件事情;CObject的析构函数是虚函数。一个函数一旦声明为虚函数,那么不管你是否加上virtual 修饰符,它在所有派生类中都成为虚函数。但是由于理解明确起见,建议的方式还是加上virtual 修饰符。
C++不把虚析构函数直接作为默认值的原因是虚函数表的开销以及和C语言的类型的兼容性。有虚函数的对象总是在开始的位置包含一个隐含的虚函数表指针成员。如果是对于MFC类CPoint和CSize这样的小型类,增加一个指针就增加了很多内存占用,而且使得其内存表示和基类POINT和SIZE不一致。如果两个类的内存表示一致,那么这样你可以安全地把一个类的指针或数组当作另一个类的指针或数组使用。
关键字:”virtual destructor”
写不动代码的人
2004-09-12
打赏
举报
回复
up
短歌如风
2004-09-12
打赏
举报
回复
楼上已经有两位说明白了,我再举个例子:
class A
{
public:
~A(){}
};
class B : public A
{
public:
~B(){}
};
...
B * ptr = new B;//正确并且常见的使用;
delete ptr;//有没有调用B::~B()?
如果A的析构是虚的就不再有这个问题了,因为当衍生类的对象指针被向上映射为基类指针后,用这个指针调用虚函数时会调用衍生类中的实现——如果衍生类进行了override的话。
bluejugar
2004-09-12
打赏
举报
回复
因为指向的是派生类的对象,所以你要把它析构的话,就要调用派生类的析构函数,怎么办?
你只要一个办法,要基类的析构函数申明为虚的,这时系统就会自动调用了.
浅谈C#的垃圾回收-关于GC、析构函数、Dispose、and Finalize asp.net GC之析构函数详解...
对于.Net CLR的垃圾自动回收,这两日有兴致小小研究了一下。...实现Finalize方法或析构函数对性能可能会有负面影响,因此应避免不必要地使用它们。用Finalize方法回收对象使用的内存需要至少两次垃圾回收。当垃圾...
浅谈C#的垃圾回收-关于GC、析构函数、Dispose、and Finalize(转)
对于.Net CLR的垃圾自动回收,这两日有兴致小小研究了一下。...实现Finalize方法或析构函数对性能可能会有负面影响,因此应避免不必要地使用它们。用Finalize方法回收对象使用的内存需要至少两次垃圾回收。当垃圾...
浅谈C#的垃圾回收-关于GC、析构函数、Dispose、and Finalize
对于.Net CLR的垃圾自动回收...在这里sban写下自己的心得以抛砖引玉,望各路
高手
多多
指教
。 近日浏览Msdn2,有一段很是费解,引于此处:Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.
浅谈C#的垃圾回收----关于GC、析构函数、Dispose、and Finalize
来源:Sban .Net http://www.cnblogs.com/sban/archive/2007/12/02/978737.html 对于.Net CLR的垃圾自动...在这里sban写下自己的心得以抛砖引玉,望各路
高手
多多
指教
。 近日浏览Msdn2,有一段很是费解,引于此处:
C/C++ C++ / 面向对象
对象与类 成员函数、全局函数和友元函数的差别?... 关于const 在const reference parameter中使用的大不解 C++中虚函数和纯虚函数的概念,差别和分别存在的原因 为何析构函数中的cout不起作用 请
高手
介绍一
新手乐园
33,311
社区成员
41,784
社区内容
发帖
与我相关
我的任务
新手乐园
C/C++ 新手乐园
复制链接
扫一扫
分享
社区描述
C/C++ 新手乐园
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章