gpt4 book ai didi

c++ - 如何实现纯虚函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:47:01 25 4
gpt4 key购买 nike

考虑下面的例子

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

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() 尤其是当我通过 using 指令使其可用时。那么,为什么仍然是 Non Pure Virtual 抽象类,我该如何解决这个问题?

最佳答案

FunctionImpl::FunctionPureVirtual::Function 是来自不同类的不同函数。

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

它们恰好具有相同的名称、相同的参数和返回类型,但由于它们不同,using FunctionImpl::Function 行不会使该函数覆盖 PureVirtual 中的函数。

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

也就是说,PureVirtual::Function的最终重写是PureVirtual中原有的,是纯虚的。

关于c++ - 如何实现纯虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20756473/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com