假设我有CFooer并且它实现了方法void foo()。
然后我有ISomething虚拟空虚foo()= 0。
我现在创建一个类:
class CSuperFoo : public CBase, public CFooer, public ISomething
{
};
当我实例化CSuperFoo时,我是否会得到一个不能实例的抽象类错误,或者这会使用CFooer的实现来满足ISomething。如果这不起作用,为什么不呢?
谢谢
答案 0 :(得分:3)
您必须在Derived类CSuperFoo
中提供一个实现才能创建它的对象,否则它将是一个Abstract类。
需要在派生类foo()
中显式覆盖基类ISomething
中的方法CSuperFoo
,因为编译器无法在类CFooer
的方法和{之间看到任何关系{1}}由于ISomething::foo()
&之间没有任何关系CFooer
,因此它要求在派生类中实现特定方法,使其不再是Abstract类。
无法使用 Ideone 。
答案 1 :(得分:3)
如果CFooer
实际上继承自ISomething
,我相信它应该可行(我没有测试过)。如果它不是虚拟继承那么它将被视为两个不同的方法,并且需要覆盖抽象的方法。
通常在C ++中,我不会使用继承来实现接口,并且看到这段代码看起来像代码味道乍一看。如果您向我们提供更多详细信息,可能会有更好的,更多的C ++习惯方法。
答案 2 :(得分:0)
简短回答:不,你不能实例化它。
说明: 首先,您无法实例化抽象类。抽象类是具有纯虚函数的类。你知道的。现在,任何派生自这个抽象类的类在实现那些纯虚函数之前仍然是抽象的。因此,如果我SuperFoo继承自ISomething,那么在它实现ISomething中声明的纯虚函数之前,SuperFoo将保持抽象。现在你可能会认为,CFooer实现了在ISomething中声明的纯虚函数,因此SuperFoo实现了它。但是如果你认为那时你遗忘了一些东西,即函数隐藏,请看,现在SuperFoo对纯虚函数的定义从ISomething中的函数原型中隐藏起来,因此需要定义纯虚函数。所有这一切都假设CFooer继承自ISomething,因为它具有相同的函数定义,如果没有,那么你做错了,实际上你甚至应该处于这种情况。
要补充的另一件事是,如果CFooer确实继承了ISomething,那么ISomething就不需要成为CSuperFoo的一部分。您可以简单地将CFooer中定义的函数声明为虚拟,然后再在SuperFoo中实现它。根据代码的细节,还有更多可能存在的问题,例如需要虚拟继承。
答案 3 :(得分:0)
根据C ++ FAQ,这是“合法的,但不是道德的”。
http://www.parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.8
基本上,您将通过在派生类中实现具有相同名称foo的虚拟或非虚方法来“隐藏”CFooer :: foo()。
答案 4 :(得分:0)
这里有不同的案例需要考虑。第一件事是你的句子的确切含义: CFooer实现方法void foo()。如果该句子的含义是ISomething
中存在与纯抽象函数具有相同签名的函数,那么在接口上实现函数
如果CFooer
另一方面来自ISomething
接口,那么CFooer::foo
会实现该功能并提供最终的覆盖。问题是因为CSuperFoo
来自CFooer
和ISomething
,它包含两个类型ISomething
和{{1}的不同子对象}只为其中一个提供 final-overrider ,CFooer
仍然是抽象的。
如果是这种情况,将CSuperFooer
和CFooer
中的继承从CSuperFooer
更改为虚拟将解决问题(虚拟继承的设计使得即使提到类型也是如此在层次结构树的不同级别或分支中,所有标记为ISomething
的对象都代表一个唯一对象。virtual
将有一个CSuperFooer
子对象,最终的覆盖可以是那是ISomething
。