1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
using namespace std;

// 虚基类
class VirtualBase {
public:
    VirtualBase(int val) {
        cout << "VirtualBase构造函数被调用,参数值: " << val << endl;
    }
};

// 第一个继承自虚基类的类
class Base1 : virtual public VirtualBase {
public:
    Base1(int val) : VirtualBase(val) {
        cout << "Base1构造函数被调用,参数值: " << val << endl;
    }
};

// 第二个继承自虚基类的类
class Base2 : virtual public VirtualBase {
public:
    Base2(int val) : VirtualBase(val) {
        cout << "Base2构造函数被调用,参数值: " << val << endl;
    }
};

// 最终派生类,形成"菱形继承"
class Derived : public Base1, public Base2 {
public:
    // 注意这里直接初始化了VirtualBase
    Derived(int val1, int val2, int val3) 
        : VirtualBase(val3), Base1(val1), Base2(val2) {
        cout << "Derived构造函数被调用,参数值: " 
             << val1 << ", " << val2 << ", " << val3 << endl;
    }
};

int main() {
    cout << "创建Derived对象:" << endl;
    Derived d(10, 20, 30);

    return 0;
}

运行结果:

1
2
3
4
5
创建Derived对象:
VirtualBase构造函数被调用参数值: 30
Base1构造函数被调用参数值: 10
Base2构造函数被调用参数值: 20
Derived构造函数被调用参数值: 10, 20, 30

关键说明

  1. 尽管Base1和Base2都在它们的构造函数中初始化了VirtualBase,但这些初始化被忽略了
  2. 只有最终派生类Derived中对VirtualBase的初始化参数(val3 = 30)被使用
  3. 虚基类VirtualBase只被构造一次,而不是在每个继承路径上都构造一次
  4. 这就是虚继承解决"菱形问题"的方式 - 确保共享基类只有一个实例

通过虚继承,C++提供了一种优雅的方式来避免多重继承中的歧义和资源浪费。

本文采用 CC BY 4.0 许可协议,转载请注明出处。
使用 Hugo 构建
主题 StackJimmy 设计