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说

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.的答案(使用转接电话)就是要走的路.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...