微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

原文地址:https://www.jb51.cc/c/113310.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐