更复杂的钻石问题实例。如何让它与常量字段一起工作?
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=的构造函数].当 B
和 C
构造函数 运行 时,它们将忽略虚拟基 class A
,因为 D
已经初始化了它。
让我们考虑普通的菱形问题,但略有改进。现在 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=的构造函数].当 B
和 C
构造函数 运行 时,它们将忽略虚拟基 class A
,因为 D
已经初始化了它。