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

Как обеспечить соблюдение ключевого слова "переопределить"?

Есть ли способ принудительно использовать ключевое слово С++ 11 override в Visual С++ 2012?

(т.е. если я забуду сказать override, то я хочу получить предупреждение/ошибку.)

4b9b3361

Ответ 1

У С++ 11 почти было то, что вы хотите.

Первоначально ключевое слово override было частью более крупного предложения (N2928), которое также включало возможность принудительного использования его использования:

class A
{
  virtual void f();
};

class B [[base_check]] : public A
{
    void f();  // error!
};

class C [[base_check]] : public A
{
  void f [[override]] ();  // OK
};

Атрибут base_check сделает ошибку для переопределения виртуальной функции без использования ключевого слова override.

Также существовал атрибут hiding, который говорит, что функция скрывает функции в базовом классе. Если используется base_check, и функция скрывает один из базового класса, не используя hiding, это ошибка.

Но большая часть предложения была отброшена, и только функции final и override были сохранены как "идентификаторы со специальным значением", а не атрибуты.

Ответ 2

Есть несколько способов сделать это в VC++ и аналогичных способах с GCC.

VC++

Ниже приведены соответствующие номера предупреждений в VC++:

C4263 (level 4) 'function': member function does not override any base class virtual member function
C4266 (level 4) 'function': no override available for virtual member function from base 'type'; function is hidden

Чтобы включить эти два предупреждения, вы можете использовать одну из следующих опций:

  1. Установите уровень предупреждения на 4 в настройках проекта, а затем отключите предупреждения, которые вы не хотите. Это мой предпочтительный способ. Чтобы отключить нежелательные предупреждения уровня 4, перейдите в настройки проекта> C/C++> Дополнительно и введите номера предупреждений в поле "Отключить определенные предупреждения".
  2. Включите выше два предупреждения, используя код.

    #pragma warning(default:4263)
    #pragma warning(default:4266)
    
  3. Включите два выше предупреждения в настройках проекта> C/C++> Командная строка, а затем введите /w34263/w34266. Здесь опция /wNxxxx означает включение предупреждений xxxx на уровне N (N = 3 - уровень по умолчанию). Вы также можете сделать /wdNxxxx, который отключает предупреждение xxxx на уровне N.

НКУ

GCC 5. 1+ добавил новое предупреждение предложить-переопределение, которое вы можете передать как параметр командной строки -Wsuggest-override.

лязг

Clang 3. 5+ имеет -Winconsistent-missing-override, однако это обнаруживает только случаи, когда некоторые переопределяющие члены или базовые классы используют override но другие переопределяющие члены этого не делают. Возможно, вы захотите взглянуть и на инструмент clang-tidy.