已解决,问题有些不同,抱歉
我正在尝试实现通过以下接口工作的类组合工具:
class Interface
{
bool virtual use() = 0;
}
class Tool : public virtual Interface
{
void work() { use(); }
}
class InterfaceImplementation : public virtual Interface
{
bool use() { return DoSomethingUseful(); }
}
class TopClass : public Tool, public InterfaceImplementation
{
/* whatever using work() */
}
问题在于TopClass声称是抽象的。 正如我所看到的,工具是抽象的,因为接口,抽象函数得到继承,这很好。在TopClass中定义的函数现在可以覆盖这些抽象函数并使TopClass成为可实现的(如果我尝试的话可以工作),为什么在不定义这些重写函数的情况下不会发生这种情况,我只是继承它们?
我试过了: 玩虚拟的遗产和命令祖先(在TopClass的定义中)
仅供记录:(几乎不相关) TopClass有多个工具,界面复杂,这就是虚拟继承的原因。 我需要使用相同的InterfaceImplementation(一个大类)来定义多个类似TopClass的类(每个类都有不同的工具),所以我不能像上面提到的那样在TopClass中定义抽象函数。简而言之,我的设计在充分展示时有意义:)
编辑: 上面的代码组成了,这是一个无法编译的实际代码。它有点复杂,但问题是BuildRank在AIKBarnard中没有覆盖。
struct KPlugExt
{
bool virtual plug() = 0;
};
struct KEvaluator : public virtual KPlugExt
{
virtual int BuildRank(Card card) = 0;
};
struct KBarnardEvaluator : public virtual KPlugExt
{
int virtual BuildRank(Card card);
};
struct KBarnardActions : public virtual KPlugExt, public virtual KEvaluator
{
/* stuff */
};
class AIKBarnard : public KBarnardActions, public KBarnardEvaluator
{
public:
bool plug() { return false; }
};
答案 0 :(得分:1)
在实际代码中,没有类实现纯虚方法BuildRankTR
。因此,该层次结构中的每个类都被认为是抽象的。
答案 1 :(得分:0)
对不起伙计们,我现在知道问题出在哪里了。
正如您在上面所看到的,我的一个接口的实现缺少作为祖先的原始接口,因此功能实际上并不像它们应该具有的那样。由于这些发布的类之间存在许多级别,因此错误在代码中丢失,编译器指向定义中的错误位置。