c – 派生纯虚函数的实现

前端之家收集整理的这篇文章主要介绍了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&C++相关文章