考虑下面的例子
#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 讲到:
一个类是抽象的,如果它包含或继承至少一个纯虚函数,该纯虚函数的最终覆盖者是纯虚函数。
他们没有说明什么是最终覆盖者,但我认为它应该是FunctionImpl::Function()
,特别是当我通过using
指令将其提供时。那么为什么NonPureVirtual
仍然是抽象类,并且如何修复它。
PureVirtual
不是FunctionImpl
的基类,因此... - Constructorpublic FunctionImpl, public PureVirtual
->Function
在两个类中都可见,尤其是从 PureVirtual 中,没有虚继承,因此它是一个抽象类。猜测而已。 - DumbCoderPureVirtual
继承时,它无法编译的原因是您只使用using
影响了FunctionImpl :: Function
的范围/可访问性;您没有覆盖任何内容。 - Simpleoverride
关键字。它还强调了基类和派生类中默认参数不同所导致的一些意想不到的陷阱。 - Rob