MST

星途 面试题库

面试题:C++虚基类的构造函数与析构函数在多层继承中的调用顺序

假设有一个多层继承体系,其中包含虚基类。请分析并说明虚基类的构造函数和析构函数在多层继承情况下的调用顺序,并解释为什么会有这样的调用顺序。
22.1万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 调用顺序
    • 构造函数:虚基类的构造函数在其所有派生类构造函数之前被调用,并且如果有多个虚基类,按照它们在继承列表中出现的顺序调用。在虚基类构造函数调用完后,按照正常的继承顺序调用非虚基类的构造函数,最后调用派生类自身的构造函数。
    • 析构函数:析构函数的调用顺序与构造函数相反。先调用派生类自身的析构函数,然后按照继承层次从下往上调用非虚基类的析构函数,最后调用虚基类的析构函数。
  2. 原因
    • 构造函数:虚基类构造函数先调用是为了确保虚基类子对象在所有派生类使用它之前被正确初始化。因为虚基类是共享的,只有一个实例被所有派生类继承,如果不先初始化虚基类,派生类在使用虚基类相关成员时可能出现未定义行为。正常继承顺序的非虚基类构造函数在虚基类之后调用,是因为虚基类初始化完成后,才可以初始化依赖于虚基类状态的非虚基类。最后调用派生类自身构造函数是为了完成派生类特定部分的初始化。
    • 析构函数:析构函数调用顺序与构造函数相反,是因为要先释放派生类自身的资源,然后逐步释放非虚基类和虚基类的资源。这样可以保证在释放高层次对象资源时,其所依赖的低层次对象资源还存在,避免悬空指针等错误。