Рассмотрим следующий примерКак реализовать чистую виртуальную функцию
#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();
}
Compiler (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 говорит
класс является абстрактным, если он содержит или наследует по крайней мере, одинчистой виртуальной функции, для которых конечных подмены являются чисто виртуальный.
Они ничего не говорят о том, что такое конечный перехватчик, но я полагаю, что это должно быть FunctionImpl::Function()
, особенно когда я сделал его доступным с помощью директивы. Так почему же Не чистый виртуальный абстрактный класс и как я могу это исправить?
Казалось бы, вы путаете C++ с Java. Просто потому, что функции FunctionImpl и PureVirtual имеют методы одной и той же подписи, не делают реализацию другой. –
Я предполагаю, что это выдержка из более крупной программы, и может быть, что фактическая проблема заключается в следующем: если вы не хотите, чтобы PureVirtual дважды был базовым классом, вы должны наследовать его практически ('public virtual PublicVirtual'). (Google для «виртуального наследования».) – Tobias