Подтвердить что ты не робот

Могу ли я переопределить виртуальную функцию с помощью чистого виртуального?

У меня есть три класса: 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 и сегодня работает.

4b9b3361

Ответ 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).