问题描述
让我们考虑普通钻石问题,但略有改进。现在 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,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
,然后运行 B
和 C
的构造函数。当 B
和 C
构造函数运行时,它们将忽略虚拟基类 A
,因为 D
已经对其进行了初始化。