我想知道以下情况,但我显然缺少足够的术语来找到任何答案。
让我们从一个常见的案例开始:我总共有3个班级。其中2个继承自第三个,并被视为专业化。
现在这3个类仍然是部分抽象的,每个类都引入了新的纯虚函数,因为这个“类结构”可以以不同的方式实现,用于不同的目的。这三个类中的每一个都从内部访问纯虚函数,因此以后无法实现它们。
然后有一个继承自第二个类的第四个类,以专门化第二类纯虚函数的目的。还有第5课,对第3课也是如此。
现在仍然有第一类的纯虚函数,需要根据第4和第5类进行特殊化。这是我遇到一些问题的地方,我可以想出两种方法来解决这个问题,但这并不能让我满意。
我目前正在倾向于第二种解决方案,因为我想避免“钻石恐惧”。但我不喜欢随附的附加实现代码。是不是有一种更简单的方法来组合不同的(接口/)类?
例如,使用第二个解决方案,我想的是在第1类中声明的第6类中具有相同的函数原型,而不是告诉编译器第1个函数应该被函数覆盖。第六节课。可悲的是,第4和第5课的课堂声明中的using myfunction;
不起作用。
或者总的来说:有没有办法加入“接口” - 这意味着类的纯虚函数可以由完全不同的类定义,只要原型是相同的,并且只要他们都是从孩子那里继承而来的。我想尽可能避免重复代码,因为我不想要“重”类。
如果这种说法过于抽象,我会想出一个例子。
€dit:询问您的意见:在这种情况下,最佳解决方案是什么?
答案 0 :(得分:1)
我会选择与第一个非常类似的解决方案:
希望这会有所帮助。如果您需要更多帮助,我会尝试详细说明。
==============
发表评论后,希望这会有所帮助:
不完全是这样。采取第一个解决方案并从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班的朋友,因此只能从那里访问界面。