MST

星途 面试题库

面试题:C++ 复杂虚基类继承体系下析构调用顺序

考虑如下 C++ 类继承结构:有虚基类 X,类 Y1、Y2、Y3 继承自 X,类 Z1 继承自 Y1 和 Y2,类 Z2 继承自 Y2 和 Y3,最终类 W 继承自 Z1 和 Z2。当 W 的对象被销毁时,详细分析所有涉及的虚基类和普通基类析构函数的调用顺序,并解释每一步的逻辑依据。
14.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 调用顺序
    • 首先调用虚基类 X 的析构函数。
    • 然后调用 Y1 的析构函数。
    • 接着调用 Y2 的析构函数。
    • 之后调用 Y3 的析构函数。
    • 再调用 Z1 的析构函数。
    • 接着调用 Z2 的析构函数。
    • 最后调用 W 的析构函数。
  2. 逻辑依据
    • 虚基类 X:在 C++ 中,虚基类的析构函数总是最先被调用,无论它在继承体系中的位置如何。这是为了确保在销毁对象时,虚基类的资源能够得到正确清理,因为虚基类可能被多个路径继承,只有先清理虚基类,才能避免重复清理或资源泄漏等问题。
    • 普通基类 Y1Y2Y3:按照它们在 W 的直接基类(Z1Z2)中的声明顺序调用。Y1Z1 中先于 Y2 声明,Y2Z2 中先于 Y3 声明,所以先调用 Y1 的析构函数,再调用 Y2 的析构函数,最后调用 Y3 的析构函数。
    • 普通基类 Z1Z2:按照它们在 W 类定义中的声明顺序调用,Z1 先声明,所以先调用 Z1 的析构函数,再调用 Z2 的析构函数。
    • W:最后调用 W 自身的析构函数,因为 W 的析构函数负责清理 W 类自身的数据成员和完成对象销毁的最后操作,而其基类的析构函数已经在此之前完成了相应的清理工作。