为什么基类的析构函数需要定义为虚函数?

为了实现动态绑定,基类指针指向派生类对象,如果析构函数不是虚函数,那么在对象销毁时,就会调用基类的析构函数,只能销毁派生类对象中的部分数据,所以必须将析构函数定义为虚函数,从而在对象销毁时,调用派生类的析构函数,从而销毁派生类对象中的所有数据。

发表评论

后才能评论

评论(3)

  • zdb 普通 2022-04-29 3:44 下午

    如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码。
    虚析构或纯虚析构就是用来解决通过父类指针释放子类对象。
    如果子类中没有堆区数据,可以不写为虚析构或纯虚析构。

  • 文峯 普通 2022-04-21 7:58 下午

    基类指针可以指向派生类的对象(多态性),如果删除该指针delete []p;就会调用该指针指向的派生类析构函数,而派生类的析构函数又自动调用基类的析构函数,这样整个派生类的对象完全被释放。如果析构函数不被声明成虚函数,则编译器实施静态绑定,在删除基类指针时,只会调用基类的析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全

  • mpweixin用户 普通 2022-03-10 8:53 下午

    如果析构函数不被声明成虚函数,则编译器实施静态绑定,在删除基类指针时,只会调用基类的析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全。所以,将析构函数声明为虚函数是十分必要的。