C++ 层次继承
我曾经面对过这个问题。在我的C++层次树中,我有两个分支用于不同性质的实体,但相同的行为——相同的接口。我创建了这样的层次树(下图中的第一个)。 现在我想独立地处理Item或基类(第一类或第二类)。然后我创建了一个抽象分支用于此用途。我的大脑构造(下图中的第二个)。 但它不起作用。工作方案(下图中的第三个)。 我认为这是错误的逻辑。。。 有人对这种层次继承有什么想法吗?如何使它更符合逻辑?更简单的理解 对不起,我的英语-俄语互联网没有帮助:) 更新: 你要求我更明确一些,我会的 在我的项目(Adobe Framemaker插件)中,我需要使用对话框和GUI控件。在某些地方,我使用WinAPI控件,在其他一些地方使用FDK(内部Framemaker)控件,但我希望使用相同的接口 我不能使用一个基类并从中继承其他基类,因为所有需要的控件都是层次结构树(不是一个类) 所以我有一个用于WinAPI控件的层次结构树,一个用于FDK,还有一个用于任何控件的抽象树 例如,有一个编辑控件(WinEdit和FdkEdit实现)、一个按钮控件(WinButton和FdkButton实现)和基本实体控件(WinControl和FdkControl实现) 现在我可以在实现树(Win和Fdk)中链接我的类,并在它们之间进行继承(WinControl是WinButton和WinEdit的基类;FdkControl是FdkButton和FdkEdit的基类)。我可以链接到抽象类(Control是WinControl和FdkControl的基类;Edit是WinEdit和FdkEdit的基类;Button是WinButton和FdkButton的基类)。但是我无法链接我的抽象树编译器誓言 事实上,我有两个层次树,我想从另一个继承 更新:C++ 层次继承,c++,oop,inheritance,tree,hierarchy,C++,Oop,Inheritance,Tree,Hierarchy,我曾经面对过这个问题。在我的C++层次树中,我有两个分支用于不同性质的实体,但相同的行为——相同的接口。我创建了这样的层次树(下图中的第一个)。 现在我想独立地处理Item或基类(第一类或第二类)。然后我创建了一个抽象分支用于此用途。我的大脑构造(下图中的第二个)。 但它不起作用。工作方案(下图中的第三个)。 我认为这是错误的逻辑。。。 有人对这种层次继承有什么想法吗?如何使它更符合逻辑?更简单的理解 对不起,我的英语-俄语互联网没有帮助:) 更新: 你要求我更明确一些,我会的 在我的项目(A
我已经完成了这个任务!:)
我使用了虚拟继承,得到了这样的方案(http://img12.imageshack.us/img12/7782/99614779.png). 抽象树只有绝对的抽象方法。抽象树中的所有继承都是虚拟的。从实现树到抽象的链接是虚拟的。为简单起见,图中仅显示了一个实现树。
谢谢你的帮助 C++支持多重继承,因此可以使用(2)和(3)的并集,确保
AbstractBase
始终声明为虚拟基类
在不了解各种类的真正含义和用途的情况下,很难提供更好的建议。从描述中不清楚这是否适用于您,但通常带有公共接口的类会在
AbstractBase
中定义接口,然后让具体实例直接从中继承(FirstItem
,SecondItem
)
为什么要在示例中使用额外的间接寻址?对于使用一个接口的不同实现,在
AbstractItem
、FirstBase
和SecondBase
中需要什么
您可以将其与工厂设计模式相结合,以便以不同的方式构建两个实现
然而,对于您的类体系结构来说,它可能看起来太简单了
但是正如你的答案下面的评论所说:很难想象你的类有这样的名称,你应该更明确,这样我们才能想到一个精确的设计。看到有意义的名称,而不是
FirstBase
,FirstItem
,SecondBase
,等等。有这样的名称的原因是什么“AbstractItem”?为什么不建立一个“AbstractBase”类,不仅对FirstBase和SecondBase,而且对FirstItem和SecondItem都是一个公共类?如果您的实体具有相同的行为和相同的接口,它们应该属于同一个类。您不能抽象设计。设计合理层次结构的唯一方法是知道类是什么,它们做什么。而您没有告诉您就是这样,所以我们不可能帮你。