c++ - 避免菱形继承(钻石问题)

标签 c++ design-patterns inheritance diamond-problem

<分区>

我有一个类A .

类(class) BC是从类 A 派生的接口(interface).

      A
    /   \
   B     C

现在我必须实现类 DE对于BC .

然后有一些类:FDB , GDC , HEC , IEB , JDB , KDC , LEB , MEC (虽然这些类名称末尾的 DBDC 表示该类使用 DB 作为 DB 的结尾, DC 作为 DC 的结尾, EB 对于 EB 等。

所以:

class A..

class `B`: public virtual `A`..
class `C`: public virtual `A`..

class `D`: public B, public `C`..
class `E`: public B, public `C`..

class `FDB`: public `D`..
class `GDC`: public `D`..
class `HEC`: public `E`..
class `IEB`: public `E`..
class `JDB`: public `D`..
class `KDC`: public `D`..
class `LEB`: public `E`..
class `MEC`: public `E`..

但后来我继承了钻石,但我不想要它。

有人可以建议另一种设计吗?

感谢任何帮助!

最佳答案

您想要/需要避免多重继承的原因是什么?

无论哪种方式,如果在某些情况下您不能(不想)使用继承,请使用封装:

class A..

class `B`: public virtual `A`..
class `C`: public virtual `A`..

class `D`: public B {
private:
    C c_instance_;
};
class `E`: public B {
    C c_instance_;
};

... 

为避免代码重复,可以创建一个C(或D)holder,通过protected inheritance和CRTP继承。这样,一个单独的基类拥有 C 基本功能,但从它继承的类没有公共(public)基类:

class A..

class B: public A..
class C: public A..

template<class Specialized, class DependedOn>
class DependsOn {
protected:
    DependedOn& get() { return implementation_; }
private:
    DependedOn implementation_;
};

class D: public B, protected DependsOn<D, C> .. // inheritance with CRTP
class E: public B, protected DependsOn<E, C> .. // inheritance with CRTP

class FDB: public D, protected DependsOn<FDB, B> .. 

D , E , FDB依此类推,将使用 get()内部方法(或更具体地说,DependsOn<D, C>::get()DependsOn<E, C>::get() 等)来实现公共(public)接口(interface)。

DependsOn<D, C>不同于DependsOn<E, C> ,您只有一个由整个层次结构实现的通用接口(interface)。

关于c++ - 避免菱形继承(钻石问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16439014/

相关文章:

c++ - builder 模式——配置文件读取

java - 一种扩展可实例化类并添加值组件同时保留相等契约的方法

C# 对象继承

python - 在多重继承的情况下, super 方法如何在 python 中工作?

c++ - unique_ptr vector 的迭代器的访问成员

c++ - C++11 中的默认构造函数、POD 的初始化和隐式类型转换

c++ - 多个相似功能的编码风格

c++ - 当高度小于边界半径的两倍时保持圆 Angular ?

c++ - 如何在 C++ 中实现这个模式?

design-patterns - 领域驱动设计定义的应用程序服务中的数据库事务