MST

星途 面试题库

面试题:C++复杂继承结构下虚基类的构造函数调用顺序

在一个具有多层复杂继承且包含虚基类的C++类体系中,详细说明虚基类的构造函数调用顺序规则,并分析为什么会有这样的顺序,结合代码示例进行解释。
35.7万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

虚基类构造函数调用顺序规则

  1. 总体规则:在多层复杂继承且包含虚基类的C++类体系中,虚基类的构造函数会在其所有派生类构造函数之前被调用,并且只会被调用一次,无论虚基类在继承体系中有多少条路径被派生。
  2. 具体顺序:从最顶层的虚基类开始,按照继承体系的深度优先顺序调用构造函数。如果存在多个虚基类,它们按照在继承列表中声明的顺序依次被构造。

原因分析

这样的顺序设计主要是为了保证虚基类的成员变量在其派生类使用之前被正确初始化,避免重复初始化造成的数据不一致问题。因为虚基类是被共享的,只有在最开始就初始化好,才能保证所有依赖它的派生类都能正确使用。

代码示例

#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;
}

代码解释

  1. 在上述代码中,VirtualBase 是虚基类。Intermediate 类以虚继承的方式继承自 VirtualBaseFinal 类继承自 Intermediate
  2. 当创建 Final 类的对象 f 时,输出结果为:
    VirtualBase constructor
    Intermediate constructor
    Final constructor
    
    可以看到,虚基类 VirtualBase 的构造函数首先被调用,然后是 Intermediate 类的构造函数,最后是 Final 类的构造函数,符合前面所述的虚基类构造函数调用顺序规则。