更复杂的钻石问题实例如何使其与常量字段一起使用?

问题描述

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...