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