考虑下面的例子
#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; ^
但是当我没有派生PureVirtual的形式时,一切都可以.这是奇怪的,因为标准10.4.4说
A class is abstract if it contains or inherits at least one pure
virtual function for which the final overrider is pure virtual.
他们并不在说什么是最终的覆盖者,但我认为它应该是FunctionImpl :: Function(),特别是当我通过使用指令可用.那么为什么还有NonPureVirtual抽象类,我该如何解决这个问题.
解决方法
FunctionImpl :: Function和PureVirtual :: Function是不同类的不同函数.
它们各自的类型是void(FunctionImpl :: *)()和void(PureVirtual :: *)().
由于PureVirtual和FunctionImpl是不相关的类,所以这些函数类型是不相关的.
它们恰好具有相同的名称和相同的参数和返回类型,但是由于它们不同,所以使用FunctionImpl :: Function行不会使该函数在PureVirtual中被覆盖.
并且如果你声明一个类型为void(PureVirtual :: *)()的变量,那么你将无法为它赋值FunctionImpl :: Function.
换句话说,PureVirtual :: Function的最终覆盖是PureVirtual中的最终覆盖,PureVirtual是纯虚拟的.
为了做出你想要的可能性,Matthieu M.的答案(使用转接电话)就是要走的路.