c++ - 在菱形继承(钻石问题)中更喜欢一个类的变量

标签 c++ tags diamond-problem

我想在菱形继承中优先选择一个类的变量。

这是代码:

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/

相关文章:

HTML5 有效的命名空间标签前缀

html map 区域悬停效果

python - Python中的一对一继承

c++ - 当我按值而不是按引用返回时,为什么不能调用运算符?

c++ - 采用类型 T 的包的模板

svn - 将二进制文件提交到 SVN

java - java中的多重继承

C++ - 在没有 RTTI/dynamic_cast 的情况下向下转换菱形继承对象

c++ - 在 CodeLite 中链接 SFML

c++ - 使用模板和新分配时性能不佳