Рассмотрим следующий пример
#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
абстрактный класс и как я могу исправить это.