【发布时间】:2013-12-31 03:38:15
【问题描述】:
考虑下面的例子
#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 说
一个类是抽象的,如果它包含或继承至少一个纯 最终覆盖器是纯虚拟的虚函数。
他们并没有说明 final overrider 是什么,但我想它应该是 FunctionImpl::Function(),尤其是当我通过 using 指令使其可用时。那么为什么仍然是 NonPureVirtual 抽象类,我该如何解决这个问题。
【问题讨论】:
-
PureVirtual不是FunctionImpl的基础,所以... -
public FunctionImpl, public PureVirtual->Function在两个类中都是可见的,特别是从 PureVirtual 中可见,没有虚拟继承,因此它使其成为一个抽象类。一个猜测。 -
@Simple - 我不这么认为,或者至少 - 可能版本的 gcc 中存在错误。我遇到过同样的情况,我解决了它,但我在这里没有答案。
-
@Constructor - 正是如此。问题是为什么
NonPureVirtual是抽象的。 -
从
PureVirtual继承时它无法编译的原因是你只影响FunctionImpl::Function和using的范围/可访问性;你没有覆盖任何东西。
标签: c++ polymorphism abstract-class pure-virtual virtual-functions