C++父类指针指向子类对象时子类析构函数未被调用的问题
问题原因
你遇到的问题是C++中基类未声明虚析构函数导致的典型问题,具体逻辑如下:
- C++的动态绑定(多态)只对虚函数生效,当通过基类指针删除派生类对象时,只有基类的析构函数被声明为虚函数,编译器才会根据指针指向的实际对象类型(也就是你这里的B类对象),先调用派生类的析构函数,再自动调用基类的析构函数。
- 你的代码中基类A的析构函数
~A()没有添加virtual关键字,编译器执行delete a2时,只会参考指针的静态类型(即A*),仅调用A类的析构函数,不会调用派生类B的析构函数。这种情况如果B类中有申请堆内存等资源,会直接导致资源泄漏。
修复方案
仅需将基类A的析构函数声明为虚函数即可:
#include <iostream> using namespace std; class A { public: A() { cout << "A constructor" << endl; } // 给析构函数添加virtual关键字 virtual ~A() { cout << "A destructor" << endl; } }; class B : public A { public: B() { cout << "B constructor" << endl; } ~B() { cout << "B destructor" << endl; } }; int main() { A a1; A *a2 = new B(); delete a2; }
修改后运行输出符合预期:
A constructor A constructor B constructor B destructor A destructor A destructor
开发规范提示
- 如果某个类被设计为基类用于继承,必须将其析构函数声明为虚函数。
- 如果类不需要被其他类继承,无需添加虚析构函数,避免额外的虚函数表指针内存开销和运行时寻址损耗。
内容的提问来源于stack exchange,提问作者daniel
相关产品推荐
相关产品推荐

