MST

星途 面试题库

面试题:C++多重继承下虚析构函数调用顺序

考虑以下C++多重继承的代码结构: class A { public: virtual ~A() { std::cout << "A destructor" << std::endl; } }; class B { public: virtual ~B() { std::cout << "B destructor" << std::endl; } }; class C : public A, public B { public: ~C() { std::cout << "C destructor" << std::endl; } }; 请分析在`C* obj = new C(); delete obj;`执行时,虚析构函数的调用顺序,并阐述其原理。
30.5万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 调用顺序
    • 首先调用C的析构函数,输出C destructor
    • 接着调用B的析构函数,输出B destructor
    • 最后调用A的析构函数,输出A destructor
  2. 原理
    • 在C++中,当通过基类指针删除派生类对象(如C* obj = new C(); delete obj;,这里通过delete操作符,使用基类指针obj删除派生类C的对象)时,若基类的析构函数为虚函数,会发生动态绑定。
    • 析构函数的调用顺序是从最派生类(这里是C)开始,逐步向上调用其基类的析构函数。这是因为最派生类对象包含了其所有基类子对象,先析构最派生类可以释放其特有的资源,然后再依次析构基类子对象,释放基类相关的资源,从而保证整个对象的正确销毁。所以先调用C的析构函数,然后按照继承顺序(先AB),依次调用BA的析构函数。