接口的钻石继承(C++)
Diamond inheritance of interfaces (C++)
我偶然发现了一个钻石继承问题,我不确定最佳解决方案。以下代码有效并且没有钻石问题:
class Element { /* pure virtual functions */ };
class Diode : public Element {};
class Thyristor : public Diode {};
不过,我不喜欢公共继承,因为晶闸管不是二极管,它只是经常像二极管一样工作,所以我想使用很多二极管代码。我可以通过使用组合而不是继承来实现它,但这会导致二极管和晶闸管之间的内部数据结构重复,这是我不喜欢的。我想做的是使用私人继承。如果我这样做,那么晶闸管也需要从Element公开继承:
class Thyristor : public Element, private Diode {};
潜在的问题是,我现在已经创建了一个钻石,因为元素是直接通过二极管继承的。如果Element是一个纯虚拟函数,这是一个问题吗?如果是,解决这个问题的正确方法是什么,只对晶闸管类别进行更改?
在这种情况下,您肯定应该使用聚合而不是继承。
追溯过去,问问自己:我为什么要在这里继承遗产?晶闸管和二极管如何在外部代码中使用?很快你就会发现元素不需要继承,只需要聚合必要的行为(接触次数、传导行为等(
相关文章:
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 混合组合和继承的C++问题
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 公共与私人继承
- 如何创建从同一类继承的不同对象的向量
- 如何从另一个文件继承私有成员变量和公共函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 带有继承的C++工厂
- 我应该避免多重实现继承吗
- C++继承更改成员
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 关于C++中具有多重继承"this"指针的说明
- 尝试使用继承和模板实现CRTP.Visual Studio正在生成编译器错误
- 如何在QT Creator上将QWidget声明为继承类的对象