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

时间:2013-04-03 22:17:14

标签: c++ inheritance virtual

我想知道以下情况,但我显然缺少足够的术语来找到任何答案。

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

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

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

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

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

enter image description here

  • 有一个第六类不继承第一类,但实现了适合第四和第五类的专门用途。然后从第6类继承第4类和第5类,并添加第1类的纯虚函数的实现。这些实现除了调用第6个类似的函数,传递相同的参数等之外别无其他。

enter image description here

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

  1. 完全按照您的描述创建第6个类。
  2. 现在使用桥梁设计模式 - 在2和2中都有一个内部成员类型1中的3个。向此内部成员注入第6类的实例。
  3. 为类4和4中缺少的虚拟方法创建隧道实现。 5.实施应该是一个单行程,只需从6开始调用具体实现。
  4. 希望这会有所帮助。如果您需要更多帮助,我会尝试详细说明。

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

    发表评论后,希望这会有所帮助:

    不完全是这样。采取第一个解决方案并从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() 
         } 
    }
    

答案 1 :(得分:1)

最初的想法来自Avi,但我不知道这是否是最好的解决方案。我仍然会发布它有一个完整的线程

我将第6类的接口作为第1类的聚合。聚合的实际类型将在第4层(第4 /第5类)进行控制,其中适当类的常量动态实例将通过构造函数调用传递到第1类。指针将存储在此处。虽然它将是第7类的指针,它只定义了第6类的接口。我还让第一堂课成为了第7班的朋友,因此只能从那里访问界面。

enter image description here