问一个基础问题,请高手深入解释一下,谢谢!

navy_koo 2005-08-27 11:43:15
C++中当一个类打算被用作其它类的基类时,它的析构函数必须是虚的!
几乎每本C++书中都有这句话,我想知道其真正的原因?

可能问题有点菜,还请各位大侠给小弟详细解释一下,谢谢!!!

另外,我想看一下C++中有关堆栈分配方面的书,可否推荐一下!!!
...全文
354 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zousoft 2005-08-27
  • 打赏
  • 举报
回复
对,说白了就是为了让父类和子类的所有析构函数都被调用,其实如果你有兴趣,可以留意一下其他的语言,也都是将析构函数声明成虚拟的,比如Delphi就是,目的是一样的,不过好像Delphi如果不声明成虚拟的,会只调用子类析构而不调用父类的。总之不管是什么顺序,道理都是类似的。
daiweisource 2005-08-27
  • 打赏
  • 举报
回复
// 如果 类B 是由 类A 派生而来
{
A* p;
B b;
p = &b;
}
//如果A的析构函数是虚拟的,则p的生存期结束后,先调用~B(),再调用~A()
//如果~A()是非虚拟的,则只调用~A(),这时,由B()获取的资源就可能不会被正常释放
//这个机制叫做动态联编,可以用搜索引擎找一找更深入的讲解。
v41dugu 2005-08-27
  • 打赏
  • 举报
回复
对不起 我补充一下 我说的调用子类的析构 是指的按照正确的步骤来,就是先调用基类的 然后再调用子类的
fangrk 2005-08-27
  • 打赏
  • 举报
回复
C++中当一个类打算被用作其它类的基类时,它的析构函数必须是虚的

——当通过基类指针删除一个继承类对象时才会调用基类的析构函数。

现在不理解没关系,你就记住好了。
v41dugu 2005-08-27
  • 打赏
  • 举报
回复
这样做是为了通过指向基类的指针访问子类的时候能够正确的调用子类的析构函数 ,而不是调用基类的 实现了多态
karlfly 2005-08-27
  • 打赏
  • 举报
回复
就是为了实现多态
qhfu 2005-08-27
  • 打赏
  • 举报
回复
对不起 我补充一下 我说的调用子类的析构 是指的按照正确的步骤来,就是先调用基类的 然后再调用子类的

=================================================
这也有点扯淡吧!构析应该是先调用子类再调用基类吧!
一凡 2005-08-27
  • 打赏
  • 举报
回复
v41dugu(一步一生) daiweisource(源于代蔚)说的不错。
再告诉你一点,通常要给基类一个虚拟的析构函数,即使它并不需要析构函数
diandian82 2005-08-27
  • 打赏
  • 举报
回复
就是为了析构不同的对象
qhfu 2005-08-27
  • 打赏
  • 举报
回复
这是 c++标准规定!
如果用基类的指针指向子类的对象,delete时, 如果基类的构析不是virtual的话,行为是为定义的!!
navy_koo 2005-08-27
  • 打赏
  • 举报
回复
谢谢各位帮助。
我想知道为什么是必须的,从上面的解释来看,我觉得virtual可以有可以没有啊,事实上如果不是virtual的,程序在run的时候会报错的。

64,636

社区成员

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

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