Что значит override c

Что значит override c

Сказать по правде я долго над этим не задумывался. Нет, я знал что в C# существует модификатор new и что он скрывает реализацию членов базового класса, также он может менять модификаторы доступа (о чем я со временем забыл). Т.е. если в базовом классе, например, метод определен как публичный, используя модификатор new в наследнике – можно сделать его приватным.

Но на практике я никогда не использовал этот модификатор. Почему? Потому что его использование мне кажется говорит о том, что с кодом что-то не так. Для того чтобы реализовать полиморфизм достаточно и широко распространенных virtual-override. И если в классе потомке приходится скрывать, к примеру, реализацию базового класса. То возможно потомок наследуется не от того базового класса или базовый класс стоит раздробить на более специфицированные.

Как пример приведу два класса:

Пример, конечно, синтетический, но хотело продемонстрировать что использования new можно избежать. Достаточно выделить класс Musician как базовый сделать у него один метод Play и создать два потомка Drummer и Pianist, которые будут переопределять этот метод.

Собственно, почему я решил на писать о new и разнице его с virtual-override – потому что меня об этом спросили. И в силу того что практического использования этого модификатора не имел – забыл нюансы.

Основная разница между ними заключается в том как они ведут себя при полиморфизме. Итак пусть есть два класса — Музыкант, который играет на музыкальном инструменте, но неизвестно каком:

И класс Пианист, потомок от класса Музыкант, который знает точно, что он играет на рояле:

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

Читайте также:  Отладчик ядра должен быть деактивирован что делать

Итак в случае с virtual-override выведется:

Если же определить метод Play с использованием модификатора new на консоль выведется другое сообщение:

Код выше выведет:

При использовании new метод Play не перекрывает реализацию базового класса, а подменяет ее своей (по сути прячет ее). Поэтому когда мы сохраняем переменную типа Pianist в переменной базового типа Musician, мы не получим вызова override метода из класса Pianist , так как в не переопределяется, а подменяется метод используя new. При использовании virtual-override происходит виртуальный вызов и будет вызван переопределённый (overriden) метод из класса Pianist.

Нашел по этому поводу хорошее обсуждение на stackoverflow. В одном из ответом даже приведена картинка для пояснения. Вот она:

Знать о существовании модификатора new конечно нужно. Но его стоит использовать в исключительных случаях. Возможно, когда исходный код базовых классов недоступен. У меня складывается впечатление что вопрос про разницу new и virtual-override чаще используется на интервью в качестве каверзного вопроса чем на практике.

Последние версии документации по C# см. в руководстве по C# на сайте docs.microsoft.com.

Модификатор override требуется для расширения или изменения абстрактной или виртуальной реализации унаследованного метода, свойства, индексатора или события.

В этом примере класс Square должен предоставить переопределенную реализацию Area , поскольку Area является унаследованным от абстрактного класса ShapesClass .

Метод override предоставляет новую реализацию члена, унаследованного от базового класса. Метод, переопределенный объявлением override , называется переопределенным базовым методом. Переопределенный базовый метод должен иметь ту же сигнатуру, что и метод override . Дополнительные сведения о наследовании см. в разделе Наследование.

Невиртуальный или статический метод нельзя переопределить. Переопределенный базовый метод должен иметь тип virtual , abstract или override .

Читайте также:  Как убрать всплывающие окна рекламы на телефоне

Объявление override не может изменить доступность метода virtual . Методы override и virtual должны иметь одинаковый модификатор уровня доступа.

Модификаторы new , static и virtual нельзя использовать для изменения метода override .

Переопределяющее объявление свойства должна задавать такие же модификатор уровня доступа, тип и имя, которые имеются у унаследованного свойства, а переопределенное свойство должно иметь тип virtual , abstract или override .

В этом примере определяется базовый класс с именем Employee и производный класс с именем SalesEmployee . Класс SalesEmployee включает дополнительное свойство salesbonus , для использования которого переопределяется метод CalculatePay .

Дополнительные сведения см. в спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.

Просматривая различные примеры (один из них: Лекция. Виртуальные функции и полиморфизм), увидел, что при использовании virtual можно переопределять метод производного класса. Также увидел, что даже если ссылаться на исходный класс — все равно будет вызван метод, переопределенный в дочернем классе, только если не указана область видимости метода.

Но (!) Я копаю кучу исходников С++ и вижу, что когда переопределяют метод в дочернем классе, то добавляют слово override . Однако в вышепоказанном примере никто override не пишет.

Так нужен он или нет? И вообще, что он дает, этот override ? Везде написано, что он указывает на то что, метод переопределен, но в примерах его никто не использует, а в исходниках я его встречаю строго постоянно.

Помогите разобраться поконкретнее , virtual и override в С++ используются всегда только в паре или не всегда? И если не всегда в паре, то как это вообще влияет на выполнение кода?

Я просто пишу код и у меня выбивает ошибка на чтение нулевого адреса. Я думаю что что-то напортачил с этими виртуальными методами, хотя делаю все по шаблону.

Ссылка на основную публикацию
Что за сайт mirror bullshit agency
MIRROR.BULLSHIT.AGENCY Название сайта: Поиск по объявлениям на Авите Описание: Поиск по объявлениям на Авите Поиск объявлений по номеру Номер: Искать...
Чем открывать файл doc
Файлы формата DOC открываются специальными программами. Существует 2 типа форматов DOC, каждый из которых открывается разными программами. Чтобы открыть нужный...
Чем открываются файлы pdf
Файлы формата PDF распространены для книг, журналов, документов (в том числе, требующих заполнения и подписи) и других текстовых и графических...
Что за формат webrip
Классификация видео для пользователей дело обычное. У всех на слуху HD, 720p и прочие. Но вот про «рипы» мало кто...
Adblock detector