【问题标题】:avoiding diamond in multiple inheritance [closed]避免多重继承中的钻石[关闭]
【发布时间】:2013-05-17 12:19:02
【问题描述】:

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

集合是数字的集合

sorted 是一个排序好的集合

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

set 是没有重复的数字的集合。

Linked 和 Array 是保存数据的格式(linked 表示在堆中扩散,array 表示连续的内存量)

然后是类的组合(图中称为arraylist等数组的列表)

一个简单的 uml:

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

有更好的设计理念吗?

【问题讨论】:

  • 有一个普遍的看法,你应该prefer composition over inheritance。但是,根据您的实现语言,菱形继承模式不一定是问题。不寻常,我想知道是否有人一直在定义基类,因为他们可以,但如果你可以有多重继承,你应该能够处理菱形继承问题。
  • 为什么不在 Collection 类中添加一个 sorted* 参数,每次调用 sorted() 时都会更新?
  • georges,问题是我没有编写 main 函数。有人告诉我,他们主要期望 sorted 将返回一个 Sorted 对象

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    相关资源
    最近更新 更多