避免钻石继承

时间:2013-05-08 11:05:10

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

我有一个班级A

BC是从类A派生的接口。

      A
    /   \
   B     C

现在我必须为DE实施类BC

然后有一些课程:FDBGDCHECIEBJDBKDC,{{1} },LEB(同时MECDB在这些类名称的末尾表示该类使用DCD作为{的结尾{1}},BDB用于DCDC用于E等。

这样:

B

然后我有钻石继承,我不想要它。

有人可以提出另一种设计吗?

任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:2)

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

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

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)持有者并通过受保护的继承和CRTP继承它。这样,一个单独的基类保存了C基本功能,但是从它继承的类没有公共基类:

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> .. 

DEFDB等将在内部使用get()方法(或更具体地说,DependsOn<D, C>::get()DependsOn<E, C>::get()等等)实现公共接口。

由于DependsOn<D, C>DependsOn<E, C>不同,因此您只有整个层次结构实现的公共接口。