1

我有一堂课A

classesBC是从 class 派生的接口A

      A
    /   \
   B     C

现在我必须实现类DE两者。BC

然后是一些类:FDB, GDC, HEC, IEB, JDB, KDC, LEB, MEC(而DB这些DC类的名称末尾的 and 表示该类使用Dand作为, and for , and for等B的结尾。DBDCDCEBEB

所以:

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

但后来我有一个钻石遗产,我不想要它。

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

任何帮助表示赞赏!

4

1 回答 1

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

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

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

于 2013-05-08T11:19:03.870 回答