考虑以下示例
#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说他们没有说什么最终的替代程序,但我想它应该是
FunctionImpl::Function()
,尤其是当我通过using
指令使它可用时。那么,为什么NonPureVirtual
仍然是抽象类,我该如何解决。 最佳答案
FunctionImpl::Function
和PureVirtual::Function
是来自不同类的不同功能。
它们各自的类型为void (FunctionImpl::*)()
和void (PureVirtual::*)()
。
由于PureVirtual
和FunctionImpl
是不相关的类,因此这些函数类型是不相关的。
它们碰巧具有相同的名称,相同的参数和返回类型,但是由于它们不同,因此using FunctionImpl::Function
行不会使该函数替代PureVirtual
中的那个函数。
并且,如果您声明了void (PureVirtual::*)()
类型的变量,则将无法为其分配FunctionImpl::Function
。
换句话说,PureVirtual::Function
的最终替代是PureVirtual
中的原始替代品,它是纯虚拟的。
为了使您想要的成为可能,Matthieu M.的答案(使用转接电话)似乎是要走的路。