override в невиртуальных функциях

В C++11 FDIS говорится:

Если виртуальная функция помечена virt-спецификатором override и не переопределяет функцию-член базового класса, то программа не сформирована. базового класса, программа является некорректной. Пример:

struct B {
 virtual void f(int);
};
struct D : B {
 void f(long) override; // ошибка: неправильная сигнатура, переопределяющая B::f
 void f(int) override; // OK
};

Что если B::f не был бы помечен как виртуальный? Тогда программа является некорректной? Или override тогда следует игнорировать? Я не могу найти никакого рассмотрения этого случая в тексте std.

Обновление 1/2 (объединено) Я направил запрос редакторам C++, чтобы они посмотрели на ситуацию. Спасибо Johannes, что указал мне на это.

  • "void f(long) override" не переопределяет функцию, особенно виртуальную,
  • поэтому она не виртуальная
  • поэтому текст "Если виртуальная функция помечена..." не применяется
  • поэтому пример не соответствует тексту.

Но осознав это, я обнаружил, что намерение контекстного ключевого слова "override" не может быть выполнено: если опечатка в имени функции или неправильный тип аргумента делает саму функцию невиртуальной, то текст стандарта никогда не применяется - и "override" становится бесполезным.

Лучшим возможным решением может быть

  • размещение "virtual" перед функциями примера
29
задан towi 24 September 2011 в 09:27
поделиться