我想在菱形继承中优先选择一个类的变量。
这是代码:
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
.
但我想以某种方式更喜欢 B
类中的 x
,并通过 x
调用它。
可能吗?
我的主要目的是使用变量标记类,菱形继承(钻石问题)不允许我这样做...
谢谢
最佳答案
通过两条不同的路径从同一个类派生被通俗地(无意义地)称为“菱形问题”,通常的 react 是使用虚拟继承。与大多数传统智慧一样,这有一点道理,但基本上是错误的。
当您从一个类派生时,这是因为您希望在派生类中具有基类型的特性。如果您从同一个类派生两次,那要么是因为您想要这些功能两次,要么是因为您想要它们一次。
问题中的代码获得了两次特性,使用这些特性的任何代码都必须明确指出要使用两个基础对象中的哪一个。这很好,例如,当基类型是列表节点并且派生类型旨在参与两个单独的列表时。
另一方面,在大多数情况下,设计要求在所有派生类中使用基类型的单个拷贝。在那种情况下,基本类型应该在每个直接派生类中虚拟地继承。
所以,是的,如果代码使 DiamondBase
成为所有地方的虚拟基地,就不会出现歧义错误。这是否是正确的答案取决于底层设计。
关于c++ - 在菱形继承(钻石问题)中更喜欢一个类的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37508204/