虚析构函数

airsong_wjs 2008-11-06 04:16:38
关于虚析构函数的一个疑问:
#include <iostream.h>
class Base
{
public:
virtual ~Base() { cout<< "~Base" << endl ; }
};
class Derived : public Base
{
public:
virtual ~Derived() { cout<< "~Derived" << endl ; }
};

void main(void)
{
Base * pB = new Derived; // upcast
delete pB;
}

输出结果为:
~Derived
~Base

问题是:
如果析构函数不为虚,输出结果为:
~Base


请问这是为什么?这与析构的次序问题有什么本质的区别?

...全文
344 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
jakqigle 2008-11-07
  • 打赏
  • 举报
回复
up!
zhaohongbo83 2008-11-07
  • 打赏
  • 举报
回复
虚拟析构函数,传指针,调用子类析构函数,再析构基类
overbai 2008-11-07
  • 打赏
  • 举报
回复
析构函数不为虚
则由 Base * pB 的静态类型决定调用 pB为Base*则调用 的是~Base

如果析构函数为虚的话
在类中会多生成一个虚表指针vptr 指向虚函数表 虚函数表中存放虚函数地址
这时,调用的时候会根据pB指向的对象的this指针查找虚函数表中对应的虚函数地址,此例为~Derived

正解!
dzc8866 2008-11-07
  • 打赏
  • 举报
回复
学习了UP
redleaves 2008-11-07
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 BaihowFF 的回复:]
析构函数不虚...没办法实现多态的...这也是个基本问题...
没有虚析构函数...对象无法正常析构...没办法找到到底用父类还是子类的析构...
详细内容就看看书看看上面的连接吧...
[/Quote]
此言诧异....你还可以手工析构.比如加个Release.俺们COM都是这样搞的..
当然,C++里用虚析构会方便得多...
lily604 2008-11-07
  • 打赏
  • 举报
回复
Base * pB 因为pb是基类型的,如果析构函数不是虚函数,那么就调用基类的。
vk2211 2008-11-07
  • 打赏
  • 举报
回复
这就是虚拟析构函数的作用
holidiess 2008-11-07
  • 打赏
  • 举报
回复
up
编程-鸟人-_-- 2008-11-07
  • 打赏
  • 举报
回复
同意3楼!
up!
nk_ysg 2008-11-07
  • 打赏
  • 举报
回复
学习
q368160666 2008-11-07
  • 打赏
  • 举报
回复
Up!Up!!
xxgamexx 2008-11-07
  • 打赏
  • 举报
回复
LZ可能提了2个问题

1,Base 的virtual 与Devived 中的virtual问题

2, Base *a=new Devived;
与Devived *a=new Base;的区别了。
BuleRiver 2008-11-07
  • 打赏
  • 举报
回复
个人觉得这个才是C++多态的本质,运行时绑定到具体的函数,因为是虚析构函数,所以到运行的时候,会绑定到具体的类,然后运行相应的虚构函数,如果非虚,则只运行基类的构造函数。
这个在基类是抽象类(接口类)的时候非常重要!
太乙 2008-11-06
  • 打赏
  • 举报
回复
上面都说了,我就jf了~~~~
BaihowFF 2008-11-06
  • 打赏
  • 举报
回复
析构函数不虚...没办法实现多态的...这也是个基本问题...
没有虚析构函数...对象无法正常析构...没办法找到到底用父类还是子类的析构...
详细内容就看看书看看上面的连接吧...
icerhack 2008-11-06
  • 打赏
  • 举报
回复
析构函数不为虚,在释放内存空间得时候,就会不释放派生类得内存,造成内存泄露
帅得不敢出门 2008-11-06
  • 打赏
  • 举报
回复
析构函数不为虚
则由 Base * pB 的静态类型决定调用 pB为Base*则调用 的是~Base

如果析构函数为虚的话
在类中会多生成一个虚表指针vptr 指向虚函数表 虚函数表中存放虚函数地址
这时,调用的时候会根据pB指向的对象的this指针查找虚函数表中对应的虚函数地址,此例为~Derived
lann64 2008-11-06
  • 打赏
  • 举报
回复
跟次序无关,因为你用的是基类指针,非虚析构函数,没有动态绑定过程,就只调用基类的析构。
jia_xiaoxin 2008-11-06
  • 打赏
  • 举报
回复
如果析构函数不为虚,那么在
Base * pB = new Derived; // upcast
中,基类指针在delete时只会调用基类的析构函数,
如果为虚析构函数,基类指针在delete时先调用派生类的析构函数,然后再调用基类的析构函数
加载更多回复(7)

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧