避免钻石多重继承

时间:2013-05-17 12:19:03

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

我必须实现支持抽象数字的数据结构

Collection是一组数字

已排序是已排序的集合

list是一个数字列表集合(包括重复项)

set是一组没有dup的数字。

Linked和Array是保存数据的格式(链接意味着堆和数组中的扩散意味着一个连续的内存量)

然后有类的组合(图片中名为arraylist等的数组列表)

一个简单的uml:

uml3;

最后四个组合中的每一个(图中的最后一行)需要实现一个方法调用,该方法调用自己的排序副本(返回Sorted类型)。我想要创建4个新的类,它们是来自sorted的继承和最后一行中的类(例如,一个从Sorted类和ArrayList类继承的ArrayListSorted类),但后来我遇到了钻石问题(在同一个例子中。排序和ArrayList都是Collection offspring)

任何更好的设计理念?

1 个答案:

答案 0 :(得分:1)

在C ++中,钻石问题可以通过使用虚拟公共继承来解决。使用虚拟公共继承,基类只继承一次:

class A {...};
class B : virtual public A {...};
class C : virtual public A {...};
class D : public B, public C {...};