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

c++子类析构函数未调用

c++子类析构函数未调用

为什么父类的析构函数定义成virtual后,deletepTest2就会释放Derived的资源,否则就只能释放Base的资源,而deletepTest1就能释放Derived和Base的资源classBase{public:~Base(){cout
查看完整描述

2 回答

?
GCT1015

TA贡献1827条经验 获得超4个赞

以下只是个人理解,如有谬误请指出,谢谢。
首先需要明确两个概念:
第一个是virtual的意义,当我们通过指针调用一个类对象的方法时,编译器只有指针类型和指向地址这两个信息,它只能根据指针类型来推断指向的对象实例在内存里实际长什么样,当我们调用的是一个non-virtual方法时,C++只能根据指针类型来判断应该调用的方法,如果这个指针是一个基类指针,即使它指向的是一个子类对象,但编译器不知道啊,所以它只会调用基类中的对应方法。只有声明了virtual,C++才会在对象实例中创建一个virtualtable,里面包含了这个类对象实际持有的所有virtual函数的地址,此时我们通过一个基类指针指向子类对象,调用virtual方法,C++会到这个虚函数表中调用对应位置的函数指针,自然就能正确调用子类的方法了。
第二个是析构函数的运作方式,当我们调用一个class的析构函数,从这个class起,依次往上,每个baseclass的析构函数都会逐个被调用。这也是为什么delete子类指针,子类和父类的析构函数都会被正确调用的原因。
显然,当一个derivedclass对象,经由一个baseclass指针删除时,如果这个baseclass的析构函数是non-virtual的,C++就会直接调用baseclass的析构函数,derivedclass的析构函数自然得不到执行,当这个baseclass的析构函数是virtual的,C++在vtbl中找到这个对象实例所持有析构函数的函数指针,并调用它,然后根据析构函数的基本运作方式,子类先调用,基类后调用。
                            
查看完整回答
反对 回复 2019-05-09
  • 2 回答
  • 0 关注
  • 897 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信