面试题答案
一键面试- 构造函数调用顺序:
- 首先调用
X
的构造函数(因为Z
多重继承自X
和Y
,且在多重继承中,按照继承列表顺序调用基类构造函数,先X
后Y
)。 - 接着调用
Y
的构造函数。 - 然后调用
Z
的构造函数。 - 由于
A
虚继承自Z
,A
会跳过Z
的构造函数(虚继承的特性,虚基类构造函数由最底层派生类负责调用)。 - 调用
A
的构造函数。 - 最后调用
B
的构造函数。
- 首先调用
- 虚继承对构造函数调用顺序的特殊影响机制:
- 在普通继承中,每个派生类都会调用其直接基类的构造函数。但在虚继承中,虚基类的构造函数由最底层派生类(这里是
B
)负责调用,而不是由直接继承虚基类的类(如A
)调用。这避免了虚基类在继承体系中被多次构造,保证了虚基类在整个继承体系中有唯一的实例。例如,如果A
正常继承Z
,那么在创建B
对象时,Z
的构造函数会被A
调用一次,又被B
调用一次,这会导致Z
部分的数据被重复初始化。虚继承通过让最底层派生类统一管理虚基类构造,解决了这个问题。
- 在普通继承中,每个派生类都会调用其直接基类的构造函数。但在虚继承中,虚基类的构造函数由最底层派生类(这里是
- 合理设计构造函数确保对象状态正确性和初始化完整性:
- 虚基类构造函数:虚基类
Z
的构造函数应设计为能正确初始化其自身状态,且不依赖于非虚基类(如X
和Y
)构造后的数据(因为虚基类构造在非虚基类之前调用)。 - 非虚基类构造函数:
X
和Y
的构造函数应独立完成自身初始化,不依赖于Z
或其他后续派生类状态。 - 中间派生类构造函数:
A
的构造函数应在不调用Z
构造函数的情况下(因为虚继承),完成自身特定的初始化,同时为B
的构造提供正确的前置状态。 - 最底层派生类构造函数:
B
的构造函数应负责调用虚基类Z
的构造函数,然后按照正确顺序初始化自身及其他直接基类(这里是A
)的数据成员,确保整个对象状态的正确性和初始化的完整性。例如,可以先调用Z
的构造函数,再调用A
的构造函数,最后初始化B
自身的数据成员。
- 虚基类构造函数:虚基类