我偶然发现了一个钻石继承问题,我不确定最好的解决方案。下面的代码工作正常,没有菱形问题:
class Element { /* pure virtual functions */ };
class Diode : public Element {};
class Thyristor : public Diode {};虽然我不喜欢公共继承,因为晶闸管不是二极管,它只是经常像二极管一样工作,所以我想用很多二极管代码。我可以通过使用组合而不是继承来让它工作,但这会导致二极管和晶闸管之间的内部数据结构重复,这是我不喜欢的。我想做的是使用私有继承。如果我这样做,那么晶闸管还需要公开继承Element:
class Thyristor : public Element, private Diode {};潜在的问题是,我现在已经创建了一个菱形,因为元素是直接通过Diode继承的。如果元素是一个纯虚函数,这是一个问题吗?如果是,那么解决这个问题的正确方法是什么,只对晶闸管类进行更改?
发布于 2018-07-20 06:35:46
在这种情况下,您肯定应该使用聚合而不是继承。
只要回溯一下,问问自己:为什么我要在这里继承?晶闸管和二极管如何在外部代码中使用?很快你就会发现你不需要继承元素,只需要聚合必要的行为(联系的数量,传导行为等)。
https://stackoverflow.com/questions/51431726
复制相似问题