在钻石继承中更喜欢一个 class 中的变量

Prefer variables from one class in diamond inheritance

我想在钻石继承中更喜欢一个 class 的变量。

这是代码:

class DiamondBase { protected: int x; };
class DiamondSonA: public DiamondBase {};
class DiamondSonB: public DiamondBase {};
class DiamondGS: public DiamondSonA, public DiamondSonB {
    void func() { x = x; }
};

我收到一个错误

error: reference to ‘x’ is ambiguous

我可以这样在func()中写地址x B::x / C::x.
但我想以某种方式更喜欢 class B 中的 x,并用 x.
来称呼它 可能吗?

我的主要目的是使用变量标记 classes,钻石继承不允许我这样做...

谢谢

通过两个不同的路径从同一个 class 派生出来通俗地(无意义地)称为 "the diamond problem",通常的反应是使用虚拟继承。像大多数传统智慧一样,那里有一点道理,但基本上是错误的。

当您从 class 派生时,这是因为您希望在派生的 class 中具有基本类型的功能。如果您从同一个 class 派生两次,那要么是因为您想要这些功能两次,要么是因为您想要它们一次。

问题中的代码获得了两次特性,使用这些特性的任何代码都必须明确指出要使用两个基础对象中的哪一个。这很好,例如,当基类型是列表节点并且派生类型打算参与两个单独的列表时。

另一方面,在大多数情况下,设计要求在所有派生的 classes 中有一个基本类型的副本。在这种情况下,基本类型应该在每个直接派生的 class.

中虚拟继承

所以,是的,如果代码使 DiamondBase 到处都是虚拟基地,就不会出现歧义错误。这是否是正确答案取决于底层设计。