面试题答案
一键面试虚基类构造函数调用顺序规则
- 总体规则:在多层复杂继承且包含虚基类的C++类体系中,虚基类的构造函数会在其所有派生类构造函数之前被调用,并且只会被调用一次,无论虚基类在继承体系中有多少条路径被派生。
- 具体顺序:从最顶层的虚基类开始,按照继承体系的深度优先顺序调用构造函数。如果存在多个虚基类,它们按照在继承列表中声明的顺序依次被构造。
原因分析
这样的顺序设计主要是为了保证虚基类的成员变量在其派生类使用之前被正确初始化,避免重复初始化造成的数据不一致问题。因为虚基类是被共享的,只有在最开始就初始化好,才能保证所有依赖它的派生类都能正确使用。
代码示例
#include <iostream>
// 虚基类
class VirtualBase {
public:
VirtualBase() {
std::cout << "VirtualBase constructor" << std::endl;
}
};
// 中间派生类,继承自虚基类
class Intermediate : virtual public VirtualBase {
public:
Intermediate() {
std::cout << "Intermediate constructor" << std::endl;
}
};
// 最终派生类,继承自中间派生类,间接继承自虚基类
class Final : public Intermediate {
public:
Final() {
std::cout << "Final constructor" << std::endl;
}
};
int main() {
Final f;
return 0;
}
代码解释
- 在上述代码中,
VirtualBase
是虚基类。Intermediate
类以虚继承的方式继承自VirtualBase
,Final
类继承自Intermediate
。 - 当创建
Final
类的对象f
时,输出结果为:
可以看到,虚基类VirtualBase constructor Intermediate constructor Final constructor
VirtualBase
的构造函数首先被调用,然后是Intermediate
类的构造函数,最后是Final
类的构造函数,符合前面所述的虚基类构造函数调用顺序规则。