更复杂的钻石问题实例。如何让它与常量字段一起工作?

More complex diamond problem instance. How to make it work with constant fields?

让我们考虑普通的菱形问题,但略有改进。现在 class A 有常量字段。

struct A {
   const int a;

   A (int _a): a(_a) {}
};

struct B: virtual A {
   const int b;

   B(int _b, int _a): A(_a), b(_b) {}
};

struct C: virtual A {
   const int c;

   C(int _c, int _a): A(_a), c(_c) {}
};

struct D: B, C {
    D(int _a, int _b, int _c): ??? {}
};

那么,用什么代替问号比较明智?或者也许可以用不同的方式解决?

构造函数可以这样写:

D(int _a, int _b, int _c): A(_a), B(_b, _a), C(_c, _a) {}

因为 A 是一个虚拟基础 class,D 构造函数必须初始化它,尽管它不是 direct基地class。当构造最派生类型D的对象时,D::D会先初始化A,然后运行初始化B和[=17=的构造函数].当 BC 构造函数 运行 时,它们将忽略虚拟基 class A,因为 D 已经初始化了它。