为了账号安全,请及时绑定邮箱和手机立即绑定

派生类的析构函数什么情况下会被调用?

为什么基类的析构函数不为虚的话,基类指针指向子类对象,删除对象时,派生类的析构函数就不会被调用?


我看到的解释就是如果基类析构函数不是虚函数,Base *d = new Derived(); 这样定义的d在析构的时候只会调用Base自己的析构函数,delete d; 运行的时候,Derived自己的数据成员不会被销毁,造成内存泄漏。 


这是为什么呢?为什么可以调用子类的构造函数却不能调用子类的析构函数,这种规则不理解,析构函数到底在什么情况下才一定会被调用?

正在回答

1 回答

计算机规定是这样执行的,定义子类会自动实例化父类,删除子类会把因为实例化子类而实例化的父类删除,相反删除父类不会删除子类,如果要删除需要用虚析构函数

0 回复 有任何疑惑可以回复我~
#1

慕UI8711183 提问者

你说的这些规则我知道,我想知道为什么,也是执行的时候,内存里面是怎么操作的?
2016-08-06 回复 有任何疑惑可以回复我~
#2

海风3 回复 慕UI8711183 提问者

不清楚你哪里有疑惑。。你可以百度一下
2016-08-06 回复 有任何疑惑可以回复我~
#3

潇慕粉 回复 慕UI8711183 提问者

父类指针指向子类对象,父类指针就能指向子类的对象内存,就能指向子类的虚函数表指针,虚函数表里面有子类的析构函数指针,从而实现子类的析构函数。系统会自动调用父类析构函数。
2017-03-14 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
C++远征之多态篇
  • 参与学习       66236    人
  • 解答问题       314    个

本教程将带领大家体会面向对象三大特性中的多态特性

进入课程

派生类的析构函数什么情况下会被调用?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信