MST

星途 面试题库

面试题:C++子类析构调用父类析构在复杂继承体系中的应用

假设有一个多层继承体系,A为基类,B继承自A,C继承自B。在这个体系中,若C的对象被销毁,描述整个析构函数调用顺序,以及在不同的继承方式(public、private、protected)下,子类析构对父类析构调用的影响,同时写出验证代码。
19.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 析构函数调用顺序
    • 当C的对象被销毁时,析构函数的调用顺序是先调用C的析构函数,然后调用B的析构函数,最后调用A的析构函数。这是因为在构造对象时,是从基类开始构造,先构造A,再构造B,最后构造C,析构时则相反。
  2. 不同继承方式下子类析构对父类析构调用的影响
    • public继承:public继承时,子类对象析构时会自动调用父类的析构函数。这是因为public继承保持了基类成员的访问属性,在析构子类对象时,按照对象构造的逆序依次调用各层父类的析构函数,与继承方式无关,都是正常调用。
    • private继承:private继承时,虽然子类对象析构时同样会自动调用父类的析构函数,但是基类的成员在子类中变为private属性。不过这并不影响析构函数的调用顺序和机制,依然是先析构子类,再依次析构各层父类。
    • protected继承:protected继承时,子类对象析构同样会自动调用父类的析构函数。基类的public成员在子类中变为protected,这也不影响析构函数的正常调用顺序。
  3. 验证代码
#include <iostream>

class A {
public:
    ~A() {
        std::cout << "A's destructor" << std::endl;
    }
};

class B : public A {
public:
    ~B() {
        std::cout << "B's destructor" << std::endl;
    }
};

class C : public B {
public:
    ~C() {
        std::cout << "C's destructor" << std::endl;
    }
};

int main() {
    C c;
    return 0;
}

上述代码中,通过public继承方式展示了析构函数的调用顺序。如果要验证private和protected继承,只需要将class B : public A中的public改为privateprotected即可,观察输出结果,析构函数调用顺序不变。输出结果如下:

C's destructor
B's destructor
A's destructor