考虑以下示例

#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说



他们没有说什么最终的替代程序,但我想它应该是FunctionImpl::Function(),尤其是当我通过using指令使它可用时。那么为什么仍然是非纯虚拟抽象类,我该如何解决呢?

最佳答案

FunctionImpl::FunctionPureVirtual::Function是来自不同类的不同功能。

它们各自的类型为void (FunctionImpl::*)()void (PureVirtual::*)()
由于PureVirtual和FunctionImpl是不相关的类,因此这些函数类型是不相关的。

它们碰巧具有相同的名称,相同的参数和返回类型,但是由于它们不同,因此使用FunctionImpl::Function行不会使该函数替代PureVirtual中的那个函数。

而且,如果您声明了void (PureVirtual::*)()类型的变量,则将无法为其分配FunctionImpl::Function。

换句话说,PureVirtual::Function的最终替代是PureVirtual中的原始重写,它是纯虚拟的。

09-04 17:44