首页 > 解决方案 > 更复杂的钻石问题实例。如何使它与常量字段一起工作?

问题描述

让我们考虑普通的钻石问题,但略有改进。现在 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): ??? {}
};

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

标签: c++diamond-problemclass-constants

解决方案


构造函数可以写成如下:

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

因为A是一个虚拟基类,D构造函数必须初始化它,尽管它不是一个直接的基类。在构造大多数派生类型的对象时DD::D将首先初始化A,然后运行 ​​and 的构造B函数C。当BC构造函数运行时,它们将忽略虚拟基类A,因为D它已经初始化了。


推荐阅读