Явное переопределение виртуальной функции - PullRequest
6 голосов
/ 28 января 2011

Я только что обнаружил, что в C ++ / CLI есть ключевое слово, которого нет (AFAIK) в стандарте C ++: override.

Я не очень разбираюсь в C ++ / CLI, поэтому кто-то может объяснить, для чего он там включен, и является ли это желательной функцией, добавляемой в C ++?

Ответы [ 4 ]

12 голосов
/ 28 января 2011

override - это специальное расширение для ключевых слов от Microsoft, которое может использоваться в реализациях C ++ / CLI и Visual C ++.Он похож на аннотацию @Override в Java или override в C # и обеспечивает более точные проверки времени компиляции на тот случай, если вы не переопределили то, что намеревались.

По первой ссылке:

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

Переопределение также допустимо при компиляции для собственных целей (без / clr).См. Спецификаторы переопределения и собственные компиляции для получения дополнительной информации.

переопределение - это контекстно-зависимое ключевое слово.См. Контекстно-зависимые ключевые слова для получения дополнительной информации.

Начиная со стандарта C ++ 11, спецификатор override теперь является стандартизированным ключевым словом.Поддержка по-прежнему ограничена, и согласно этой странице из Apache StdCxx , override поддерживается GCC 4.7+, Intel C ++ 12.0+ и Visual C ++ 2012 (с поддержкой предварительной стандартизации в Visual C ++ 2005).

1 голос
/ 28 января 2011

Это помогает компилятору ловить ваши ошибки двумя способами:

  1. Если вы объявляете функцию с override в своем классе, но базовый класс не имеет этой функции, то компилятор может сказать вам, что вы не переопределяете то, что считали. Если override не было доступно, компилятор не сможет распознать вашу ошибку - он просто предположит, что вы намеревались ввести новую функцию.

  2. Если в вашем классе-потомке есть функция (без override), а затем вы объявляете ту же функцию, что и виртуальную в базовом классе, компилятор может сказать вам, что ваши изменения в базовом классе повлияли смысл оригинальной декларации в потомке. Потомок должен будет либо использовать override, либо вам придется изменить сигнатуру одной из функций.

Эта функция уже добавлена ​​в C ++ 0x.

0 голосов
/ 29 января 2011

Ключевое слово переопределения в C ++ / CLI происходит из .Net, а не является частью самого C ++.Поскольку переопределение уже объяснено, вам нужно знать альтернативу.Если вы не «переопределите» его, вы можете сделать его «новым».Делая его «новым», вы не переопределяете член родительского класса в дочернем элементе, а создаете нового члена с тем же именем.Ключевые слова new и override отличаются только в том случае, если вы используете указатель базового класса и указываете его на объект производного класса.

Итак, если вы используете указатель базового класса и указываете на объект производного класса:

If you call an "override"n member:
      the derived class member is called
if you call the "new"ed member:
      the base class member is called.
0 голосов
/ 28 января 2011

С здесь :

Если вы пометите свойство или метод в родительский класс с virtual ключевое слово, при получении класса из это, вы можете игнорировать метод или собственность, а не реализовать ее. Но если Вы решили реализовать имущество или метод, вы должны указать, что вы предоставляем новую версию свойство или метод. Предоставление нового версия свойства или метода упоминается как переопределение.

При переопределении свойства или метод, вы должны указать это записав ключевое слово override в его правый.

Теперь перейдите по ссылке , чтобы увидеть несколько примеров.

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