c – 派生纯虚函数的实现
考虑下面的例子
#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(),特别是当我通过使用指令可用.那么为什么还有NonPureVirtual抽象类,我该如何解决这个问题. 解决方法
FunctionImpl :: Function和PureVirtual :: Function是不同类的不同函数.
它们各自的类型是void(FunctionImpl :: *)()和void(PureVirtual :: *)(). 它们恰好具有相同的名称和相同的参数和返回类型,但是由于它们不同,所以使用FunctionImpl :: Function行不会使该函数在PureVirtual中被覆盖. 并且如果你声明一个类型为void(PureVirtual :: *)()的变量,那么你将无法为它赋值FunctionImpl :: Function. 换句话说,PureVirtual :: Function的最终覆盖是PureVirtual中的最终覆盖,PureVirtual是纯虚拟的. 为了做出你想要的可能性,Matthieu M.的答案(使用转接电话)就是要走的路. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |