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

Diamond inheritance of interfaces (C++)

本文关键字:C++ 继承 钻石 接口      更新时间:2023-10-16

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

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

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

class Thyristor : public Element, private Diode {};

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

在这种情况下,您肯定应该使用聚合而不是继承。

追溯过去,问问自己:我为什么要在这里继承遗产?晶闸管和二极管如何在外部代码中使用?很快你就会发现元素不需要继承,只需要聚合必要的行为(接触次数、传导行为等(