MST

星途 面试题库

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

假设有类A,类B和类C都继承自类A,类D又多重继承自类B和类C。请详细描述类D对象创建和销毁时,A、B、C、D的构造函数和析构函数的调用顺序,并说明原因。
43.5万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 对象创建时调用顺序
    • 首先调用类A的构造函数。原因是类B和类C都继承自类A,在创建类B和类C对象时,需要先初始化它们从类A继承的部分,这是C++继承机制的要求,先初始化基类部分。
    • 接着调用类B的构造函数。因为在类D的多重继承声明中,类B先于类C列出(假设声明为class D : public B, public C),按照声明顺序进行初始化。
    • 然后调用类C的构造函数。同样是按照声明顺序,在类B初始化后进行类C的初始化。
    • 最后调用类D的构造函数。此时类D从类B和类C继承的部分以及类A的部分都已初始化完成,可以进行类D自身部分的初始化。
  2. 对象销毁时调用顺序
    • 首先调用类D的析构函数。因为对象销毁时,先销毁自身部分。
    • 接着调用类C的析构函数。由于创建时是先B后C,销毁时顺序相反,这是为了保证资源释放的完整性,先释放后初始化的部分。
    • 然后调用类B的析构函数。
    • 最后调用类A的析构函数。类A是最顶层的基类,其成员是最先被初始化的,所以最后被销毁。

总结:

  • 创建顺序:A -> B -> C -> D
  • 销毁顺序:D -> C -> B -> A