MST
星途 面试题库

面试题:C++多重继承下子类析构调用父类析构的顺序及代码实现

假设存在一个C++程序,有一个子类继承自多个父类,描述这种情况下子类析构函数调用各个父类析构函数的顺序,并编写代码实现这一过程,同时说明如何保证资源的正确释放。
41.8万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 析构函数调用顺序

    • 当一个子类继承自多个父类时,析构函数的调用顺序与构造函数的调用顺序相反。即先调用子类自身的析构函数,然后按照从后往前的顺序调用各个父类的析构函数(这里的顺序是指在子类定义中继承列表里父类出现的顺序)。
  2. 代码实现

#include <iostream>

class Parent1 {
public:
    Parent1() {
        std::cout << "Parent1 constructor" << std::endl;
    }
    ~Parent1() {
        std::cout << "Parent1 destructor" << std::endl;
    }
};

class Parent2 {
public:
    Parent2() {
        std::cout << "Parent2 constructor" << std::endl;
    }
    ~Parent2() {
        std::cout << "Parent2 destructor" << std::endl;
    }
};

class Child : public Parent1, public Parent2 {
public:
    Child() {
        std::cout << "Child constructor" << std::endl;
    }
    ~Child() {
        std::cout << "Child destructor" << std::endl;
    }
};

int main() {
    Child c;
    return 0;
}
  1. 保证资源正确释放
    • 在每个类(包括父类和子类)的析构函数中,确保正确释放该类所管理的资源。例如,如果类中包含动态分配的内存(通过new运算符),则在析构函数中使用delete运算符来释放内存。如果使用了文件句柄、网络连接等资源,在析构函数中关闭相应的资源。
    • 由于析构函数调用顺序是确定的,只要每个类的析构函数正确释放自身资源,就能保证整个对象层次结构中的资源被正确释放。在上述代码中,如果Parent1Parent2Child类中有需要释放的资源(如动态分配的内存等),在各自的析构函数中进行释放操作即可。