c – 通过覆盖加入多个重叠的类?

我想知道以下情况,但我显然错过了足够的术语来找到任何答案.

让我们从一个常见的案例开始:我总共有3个班级.其中2个继承自第三个,并被视为专业化.

现在这三个类仍然是部分抽象的,每个类都引入了新的纯虚函数,因为这种“类结构”可以以不同的方式实现,用于不同的目的.这三个类中的每一个都从内部访问纯虚函数,因此以后无法实现它们.

然后有一个继承自第二类的第四类,以专门化第二类纯虚函数的目的.还有第5课,第3课也是如此.

现在仍然存在第一类的纯虚函数,它们需要根据第四和第五类进行特殊化.这是我遇到一些问题的地方,我可以想出两种方法来解决这个问题,但这并不能让我满意.

>从第1课开始继承第6课,并将其专门用于满足第4和第5课的需要,并使这些课继承自第6课.这将导致“可怕的钻石”.

>有第6课不继承第1课,但实现了适合第4和第5课的专业目的.然后从第6类继承第4类和第5类,并添加第1类的纯虚函数的实现.这些实现除了调用第6个类似的函数,传递相同的参数等之外别无其他.

我现在正倾向于第二种解决方案,因为我想避免“钻石恐惧”.但我不喜欢随附的附加实现代码.是不是有一种更简单的方法来组合不同的(接口/)类?

例如,使用第二个解决方案,我想的是在第1类中声明的第6类中具有相同的函数原型,而不是告诉编译器第1类的函数应该被第6类的函数覆盖.可悲的是,使用myfunction;在第4和第5课的班级声明中不起作用.

或者总的来说:有没有办法加入“接口” – 这意味着类的纯虚函数可以由完全不同的类定义,只要原型是相同的,只要它们都是继承自孩子.我想尽可能避免重复代码,因为我不想要“重”类.

如果这种说法过于抽象,我会想出一个例子.

€dit:询问您的意见:在这种情况下,最佳解决方案是什么?

最佳答案 我会选择与第一个非常类似的解决方案:

>完全按照您的描述创建第6个类.
>现在使用Bridge设计模式 – 在2和2中都有一个内部成员.类型1中的3个.将6类的实例注入此内部成员.
>为类4和4中缺少的虚拟方法创建隧道实现. 5.实施应该是一个单行,只需要从6开始具体实施.

希望这可以帮助.如果您需要更多帮助,我会尝试详细说明.

==============

在您的评论之后,希望这有助于:

不完全是.采取第一个解决方案并从4&amp ;;中删除6的继承. 5(4继承2和5继承3,就是这样).

Class 6继承1.让我们调用class 1 – Base.在类4和5中添加类型为Base的成员(让我们称之为impl).

假设第4类是foo,第2类是Base2.它会看起来像(对于错误的c语法感到遗憾,因为我编写了实际的c代码已经有一段时间了):

class foo: Base2
{ 
     private Base* impl; 

     public foo(Base* impl) { this.impl = impl; } 

     void virtualMethod() { 
            this.impl->virtualMethod() 
     } 
}
点赞