7 / 7 / 2
Регистрация: 21.02.2019
Сообщений: 133
|
||||||
1 | ||||||
Полиморфизм в C++: практическое использование переопределния виртуальных функций09.05.2019, 16:11. Просмотров 312. Ответов 5
Метки нет Все метки)
(
Доброго всем времени суток.
Решил разобраться с полиморфизмом в C++. Но в процессе изучения натолкнулся на такую дилемму. Не понимаю значения служебного слова override. Точнее понимаю, что оно должно сопровождать функцию класса-потомка, которая была виртуальной в базовом классе, для её переопределения. Если его не написать, то произойдет сокрытие метода. Но... а почему бы и нет? Цель была, я так понимаю - получить разную реализацию под одним и тем же именем. Сокрытие это вполне себе позволило сделать. Вот создал такой учебный пример:
Каков тогда смысл использования override? В каких ситуациях его отсутствие станет критичным?
0
|
|
09.05.2019, 16:11 | |
Практическое применение виртуальных функций Полиморфизм и исследование виртуальных функций Использование виртуальных функций
|
|
557 / 434 / 21
Регистрация: 16.12.2010
Сообщений: 953
|
|
09.05.2019, 16:15 | 2 |
override - это слово для компилятора, с помощью которого можно точно определить, что идет перегрузка виртуального метода, а не добавление нового, тем самым программист обезопасит себя, если изменит/удалит виртуальный метод в базовом классе.
2
|
7 / 7 / 2
Регистрация: 21.02.2019
Сообщений: 133
|
|
09.05.2019, 16:26 [ТС] | 3 |
Вот в этом моменте я и не догоняю пока. Обезопасит от чего?
Ведь, что я сделаю сокрытие, что переопределение, в производном классе я получаю другой функционал, не зависящий от функционала, что был определен для базового класса.
0
|
14014 / 7502 / 1774
Регистрация: 30.01.2014
Сообщений: 12,558
|
|
09.05.2019, 16:39 | 4 |
Pb-BASS, Польза от ключевого слова override
Добавлено через 2 минуты Pb-BASS, возможно вам еще стоит почитать эту статью.
2
|
868 / 327 / 75
Регистрация: 17.05.2015
Сообщений: 1,000
|
|
09.05.2019, 16:42 | 5 |
Это гарантирует, что виртуальный метод наследника переопределяет метод базового класса.
Что бы не получилось так: в базовом классе виртуальный метод изменили, а в наследниках не поправили. Например, в большом проекте, если вы измените метод базового класса, то компилятор сразу покажет всех наследников, где тоже нужно подправить сигнатуру методов.
2
|
Тематические курсы и обучение профессиям онлайн Профессия Разработчик на C++ (Skillbox) Архитектор ПО (Skillbox) Профессия Тестировщик (Skillbox) |
Комп_Оратор)
![]() |
|
09.05.2019, 16:45 | 6 |
Если вы не напишете override, но всё сделаете правильно, то всё равно произойдёт переопределение виртуального метода. То есть, перекрытия не случится. Но компилятор видит ваше намерение переопределения виртуального метода.
Ciberst говорит о том, что когда переопределён виртуальный метод и его прообраз удалён в предке, то синтаксически код верен и компилятор не станет вас беспокоить о том, что метод потерял родительский прообраз (мой кривой термин). Даже если вы в потомке укажете virtual он решит, что это начало цепи виртуальных методов. Есть ещё кое-что. Если вы напишете в потомке метод с именем таким-же как у виртуального в предке, но по сигнатуре будут отличия (мех. ошибка или намудрите с аргументами по умолчанию), то вы не получите переопределения виртуального метода, хотя будете так думать. Но если, слово override присутствует, компилятор вам скажет, что так не бывает и вы спасены. Ошибка, которая может возникнуть - логическая ошибка и может долго мучить на ровном месте.
1
|
09.05.2019, 16:45 | |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь. Использование свойства полиморфизма и исследование механизма виртуальных функций Свойства Qt. Практическое использование Практическое использование ООП
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |