【发布时间】:2013-12-24 07:08:58
【问题描述】:
考虑下面的例子
#include <iostream>
struct PureVirtual {
virtual void Function() = 0;
};
struct FunctionImpl {
virtual void Function() {
std::cout << "FunctionImpl::Function()" << std::endl;
}
};
struct NonPureVirtual : public FunctionImpl, public PureVirtual {
using FunctionImpl::Function;
};
int main() {
NonPureVirtual c;
c.Function();
}
编译器(GCC 4.9,Clang 3.5)因错误退出
test.cpp:18:20: error: variable type 'NonPureVirtual' is an abstract class
NonPureVirtual c;
^
test.cpp:4:18: note: unimplemented pure virtual method 'Function' in 'NonPureVirtual'
virtual void Function() = 0;
^
但是当我没有从Pure Virtual 派生出来时,一切都很好。这很奇怪,因为标准 10.4.4 说
一个类是抽象的,如果它包含或继承至少一个纯虚函数,其最终覆盖者是纯虚。 p>
他们并没有说明最终的替代者是什么,但我想它应该是FunctionImpl::Function(),尤其是当我通过 using 指令使其可用时。那么为什么仍然是 Non Pure Virtual 抽象类,我该如何解决这个问题?
【问题讨论】:
-
您似乎将 c++ 与 Java 混淆了。仅仅因为 FunctionImpl 和 PureVirtual 都具有相同签名的方法并不能使一个成为另一个的实现。
-
我认为这是一个较大程序的摘录,实际问题可能如下:如果您不想将 PureVirtual 作为基类的两倍,则必须从它继承实际上(
public virtual PublicVirtual)。 (谷歌的“虚拟继承”。)
标签: c++ polymorphism pure-virtual