c++ - 更复杂的钻石问题实例。如何使它与常量字段一起工作?
问题描述
让我们考虑普通的钻石问题,但略有改进。现在 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
是一个虚拟基类,D
构造函数必须初始化它,尽管它不是一个直接的基类。在构造大多数派生类型的对象时D
,D::D
将首先初始化A
,然后运行 and 的构造B
函数C
。当B
和C
构造函数运行时,它们将忽略虚拟基类A
,因为D
它已经初始化了。