0 / 0 / 0
Регистрация: 26.05.2016
Сообщений: 9
|
||||||
1 | ||||||
Смысл использования полиморфизма26.05.2016, 14:03. Показов 1147. Ответов 5
Метки нет (Все метки)
Мы создаем объекты lo и na, после создаем указатели на класса A и присваем им адреса наших предыдущих объектов, в результате, благодаря нашему виртуальному методу speak(), уникальные реализации классов-наследников доступны через базовый класс. Это все замечательно, но почему? Каждый раз, чтобы это сделать, нужно создавать en1,en2 , хотя т.к. уже есть наследование, то методы доступны и через lo и na. Да, мы реализовали доступ через базовый класс. Но зачем? Спасибо.
0
|
26.05.2016, 14:03 | |
Ответы с готовыми решениями:
5
В чем смысл полиморфизма Пример использования генератора случайных чисел для демонстрации динамического полиморфизма В чём смысл использования указателей на функции Правильное понимание и обоснование использования полиморфизма |
Модератор
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,714
|
|
26.05.2016, 14:33 | 2 |
Сообщение было отмечено Dobbyman как решение
Решение
Обратите внимание
Оба указателя - это указатели на базовый класс A. Однако, в первом случае вызывается метод класса B, а во втором - метод класса A. Как раз в этом и есть смысл. Мы заранее не знаем, как метод будет реализован в производном классе, Но можем написать код, который вызовет этот метод.
1
|
Заблокирован
|
|
26.05.2016, 14:36 | 3 |
Помогает расширяемости. Программа, которая использует указатель на A и вызывает speak() не нуждается в перекомпиляции существующего кода, и сорцы существующих классов не нуждаются в изменении для добавления нового функционала в метод speak. Таким образом снижаются риски при программировании. Ты расширяешь функционал приложения, не меняя существующий код. Если грубо и вкратце.
Конечно, если ты свои классы, как путный программист, отправишь в отдельные модули, а не все в одном, как сейчас.
1
|
693 / 303 / 99
Регистрация: 04.07.2014
Сообщений: 846
|
||||||
26.05.2016, 15:26 | 4 | |||||
Dobbyman, Плохой пример выбрал.
Код
0: Meow! 1: Woof! 2: Meow!
1
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
|
26.05.2016, 17:17 | 5 |
Ну, чтобы это понять, нужно получше разобраться что такое открытое наследование. А это некоторая специализация базового класса, т.е. описание некоторого подмножества множества объектов базового класса.
Ну, к примеру, базовый класс у нас Станок. И у множества объектов-станков есть подмножество объектов - сверлильных станков. Для описания этого подмножества объявляем класс-наследник Сверлильный_станок. Базовый класс можно специализировать в наследнике просто добавляя новые члены (данные и функции), а можно специализировать поведение базовых функций-членов, это как раз и делается через механизм виртуальных функций. Ну, допустим, вы отдаете всем объектам-станкам в цеху команду Обработать_деталь. С одной стороны, это базовая функция-член класса Станок, так как все станки должны обрабатывать детали. С другой - каждый станок обрабатывает деталь в соответствии со своей специализацией, - сверлильный - сверлит, токарный точит, и т.д. Технически для этого нужно создать коллекцию указателей на базовый класс Станок, и поместить туда адреса всех объектов-станков. Тогда, чтобы каждый станок начал обрабатывать деталь, нужно всем станкам дать команду Обработать_деталь, и каждый выполнит ее в соответствии со своей специализацией.
1
|
Комп_Оратор)
|
|
26.05.2016, 19:42 | 6 |
Если бы и не было наследования они были бы доступны через экземпляры классов A и B, например через lo и na. Дело не в том что они недоступны, а в том как они доступны. Если Вы хотите создать коллекцию родственных сущностей вроде экземпляров A и B можно бы создать класс С в котором есть указатели на A и B и метод который вызывает метод speak того объекта, указатель на который не равен nullPtr. Тогда имея контейнер объектов С можно пройти по нему вызвав метод speak(). Это будет работать если A и B не родственники и единственное что их объеденияет это то, что они умеют void speak(); (это тоже не обязательно с формальной точки зрения).
При использовании полиморфизма итерация с вызовом speak() идёт по контейнеру указателей на базовый класс инициализированных адресами объектов A и B (которые родственники). Это легче.
1
|
26.05.2016, 19:42 | |
26.05.2016, 19:42 | |
Помогаю со студенческими работами здесь
6
Смысл использования using в коде Смысл использования интерфейсов Смысл использования this в конструкторе Смысл использования отдельной переменной? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |