Как переопределить не виртуальные функции? - PullRequest
6 голосов
/ 03 апреля 2011

Совершенно новый синтаксис override позволяет компилятору сообщать об ошибке, если на самом деле не переопределяет виртуальную функцию N3206 .

class Base {
    virtual void vfunc();
    void afunc();
};

Следующие случаи будут ошибкой в ​​class Derived : public Base, как указано в примерах Std:

  • void vfunk() override; // err: typo
  • void vfunc(int) override; // err: argument
  • void vfunc() const override; // err: cv

Но что, если базовый метод не виртуальный ?

  • void afunk() override; // ?
  • void afunc(int) override; // ?
  • void afunc() const override // ?;

1 Ответ

11 голосов
/ 03 апреля 2011

В спецификации проекта (n3242) написано

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

Поскольку объявления функций, которые вы показываете, не являются виртуальными, вы также сталкиваетесь с

Virt-specier-seq должен содержать не более одного из каждого virt-спецификатора. Переопределение и final-спецификаторы virt-only должны появляться только в объявлении виртуальной функции-члена.

Обратите внимание, что функция, которая имеет то же имя и список параметров (включая constness), что и базовая функция, но это не virtual not переопределяет эту базовую функцию. Вместо этого говорится, что скрыть базовую функцию.

Обозначение, что функция скрывает базовую функцию, помещая new вместо override после того, как объявление функции было частью черновика C ++ 0x, но не будет частью C ++ 0x, так как были проблемы с поиск синтаксических пятен для нефункциональных членов для размещения new во времени. Следовательно, он был отвергнут за C ++ 0x.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...