Могу ли я переопределить виртуальную функцию с помощью чистого виртуального?
У меня есть три класса: B
, D
и G
. D
- это B
, а G
- D
. Оба B
и D
являются абстрактными. B
принадлежит третьей стороне.
B
имеет не чистый, виртуальный метод, который G
должен реализовать (быть D
). Могу ли я и хорошая практика переопределить/переопределить виртуальную функцию как виртуальную?
Пример:
class B // from a third party
{
public:
virtual void foo();
};
class D : public B
{
public:
void foo() override = 0; // allowed by gcc 4.8.2
virtual void bar() = 0;
};
class G : public D
{
public:
// forgot to reimplement foo
void bar() override;
};
int main()
{
G test; // compiler error is desired
}
На вопрос "могу ли я?" gcc позволяет это, но у меня нет термина/словарного запаса, чтобы проверить, что поведение является частью стандарта или undefined и сегодня работает.
Ответы
Ответ 1
Вы спросили:
Можно ли переопределить виртуальную функцию с помощью чистого виртуального?
Ответ: Да, вы можете. Из стандарта С++ 11:
10.4 Абстрактные классы
5 [Примечание. Абстрактный класс может быть получен из класса, который не является абстрактным, а чистая виртуальная функция может переопределять виртуальную функцию, которая не является чистой. -end note]
Ответ 2
Если вы скомпилируете код с более современным компилятором, вы получите следующие сообщения об ошибках, которые объясняют проблему.
prog.cc:23:6: error: variable type 'G' is an abstract class
G test; // compiler error is desired
^
prog.cc:10:9: note: unimplemented pure virtual method 'foo' in 'G'
void foo() override = 0; // allowed by gcc 4.8.2
^
1 error generated.
Что касается Стандарта, то (10.3 Виртуальные функции)
11 Должна быть определена виртуальная функция , объявленная в классе, или объявленный чистый (10.4) в этом классе или и то, и другое; но диагностика отсутствует требуется (3.2).