接口的钻石继承(C ++)

时间:2018-07-19 21:08:01

标签: c++ inheritance

我偶然发现了钻石继承问题,但我不确定最佳解决方案。以下代码有效,并且没有钻石问题:

class Element { /* pure virtual functions */ };
class Diode : public Element {};
class Thyristor : public Diode {};

我不喜欢公共继承,因为晶闸管不是二极管,它经常像二极管一样工作,以至于我想使用很多二极管代码。我可以通过使用合成而不是继承来使其工作,但这导致Diode和晶闸管之间的内部数据结构重复,这是我不喜欢的。我想做的是使用私有继承。如果我这样做,那么晶闸管也需要从Element公开继承:

class Thyristor : public Element, private Diode {};

潜在的问题是我现在已经创建了一颗钻石,因为Element是直接通过Diode继承的。如果Element是纯虚函数,这是一个问题吗?如果是的话,仅对晶闸管类进行更改的解决此问题的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

在这种情况下,您一定要使用聚合而不是继承。

只需追溯一下并问自己:为什么我要在这里继承?外部代码中如何使用晶闸管和二极管?很快您会发现您不需要继承元素,只需汇总必要的行为(接触次数,传导行为等)