Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 层次继承_C++_Oop_Inheritance_Tree_Hierarchy - Fatal编程技术网

C++ 层次继承

C++ 层次继承,c++,oop,inheritance,tree,hierarchy,C++,Oop,Inheritance,Tree,Hierarchy,我曾经面对过这个问题。在我的C++层次树中,我有两个分支用于不同性质的实体,但相同的行为——相同的接口。我创建了这样的层次树(下图中的第一个)。 现在我想独立地处理Item或基类(第一类或第二类)。然后我创建了一个抽象分支用于此用途。我的大脑构造(下图中的第二个)。 但它不起作用。工作方案(下图中的第三个)。 我认为这是错误的逻辑。。。 有人对这种层次继承有什么想法吗?如何使它更符合逻辑?更简单的理解 对不起,我的英语-俄语互联网没有帮助:) 更新: 你要求我更明确一些,我会的 在我的项目(A

我曾经面对过这个问题。在我的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的基类)。但是我无法链接我的抽象树编译器誓言

事实上,我有两个层次树,我想从另一个继承

更新:
我已经完成了这个任务!:)
我使用了虚拟继承,得到了这样的方案(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都是一个公共类?如果您的实体具有相同的行为和相同的接口,它们应该属于同一个类。您不能抽象设计。设计合理层次结构的唯一方法是知道类是什么,它们做什么。而您没有告诉您就是这样,所以我们不可能帮你。