0 / 0 / 0
Регистрация: 01.05.2015
Сообщений: 3
|
||||||
1 | ||||||
Как работает dynamic_cast01.05.2015, 13:46. Показов 2501. Ответов 9
Метки нет (Все метки)
Почему все if-ы срабатывают?
0
|
01.05.2015, 13:46 | |
Ответы с готовыми решениями:
9
Написать шаблон ptr_cast, который работает аналогично dynamic_cast (задача из книжки Страуструпа) Как избавиться от dynamic_cast? Для чего именно и как исползуется dynamic_cast(обясните "ЯЗИКОМ ЧЕЛОВЕКА") dynamic_cast |
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
||||||
01.05.2015, 13:51 | 2 | |||||
Потому что объект Circle является сразу и Point и Shape. Ты сам так написал, значит так и будет
Наследование-то ведь такое у тебя?
0
|
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
|
|
01.05.2015, 13:53 | 3 |
DrOffset, а как ты это понял, не видя иерархию?
0
|
0 / 0 / 0
Регистрация: 01.05.2015
Сообщений: 3
|
||||||
01.05.2015, 13:55 [ТС] | 4 | |||||
У меня Другое наследование
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
|
01.05.2015, 14:02 | 5 |
Суть в общем-то не особо поменялась.
Добавлено через 39 секунд Телепатия. Помехи только на линии. Видишь два класса местами поменялись . Добавлено через 2 минуты Farada, Ты говоришь этим кодом: Есть класс Shape, Есть класс Point, который является Shape, Есть класс Circle, который является Point. dynamic_cast работает как часы. Что ты написал, то он и показал
1
|
0 / 0 / 0
Регистрация: 01.05.2015
Сообщений: 3
|
|
01.05.2015, 14:07 [ТС] | 6 |
Как же определить фигуру?
0
|
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
|
|
01.05.2015, 14:21 | 7 |
Сделай виртуальную функцию, которая для каждого класса будет возвращать какое-то своё значение.
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
|
01.05.2015, 14:31 | 8 |
Farada,
Можно ввести виртуальный метод type() который будет возвращать идентификатор нужного типа в виде числа, например. Потом это число проверить. Можно воспользоваться механизмом RTTI, в C++ см. описание typeid, <type_info> в своем учебнике. Но вообще все это неправильно. Начиная с того, что наследование у тебя не особо верное. Как круг может быть одновременно точкой? Или ты физику описываешь этой иерархией (все можно представить материальной точкой)? Но в таком случае почему точка наследуется от класса фигура? В общем, это все странно. Второе. Если уж ты связался с наследованием, то для таких задачек грамотно использовать полиморфизм, а не касты и проверки типов. То есть, если тебе надо в функции print вывести фигуру, то в иерархии должен быть виртуальный метод print, реализованный для каждого типа фигуры соответствующе.
0
|
01.05.2015, 14:36 | 9 |
Суть полиморфизма в том, что таких задач по определению класса не должно возникать. Код должен быть полиморфным.
Если такая задача есть, значит архитектура не правильная.
0
|
542 / 163 / 79
Регистрация: 23.09.2013
Сообщений: 316
|
||||||||||||||||
01.05.2015, 14:40 | 10 | |||||||||||||||
Farada, Идея полиморфизма в её реализации через наследование и виртуальные функции предполагает осознанный отказ кода, который работает с указателем/ссылкой на базовый класс от любых предположений/попыток определения типа, который реализует виртуальные методы базового класса. Чаще всего, если в коде, Вам потребовалось из базового класса, путем перебора или считыванием явного флага находить конкретный тип, и работать с этим типом - вероятно Вы используете средства языка не совсем корректно. (За исключением быть может типов-контейнеров-объединений, типа boost::variant/boost::any/QVariant.
В приведенном Вами примере, вам следовало у базового типа создать метод, описывающий фигуру:
1
|
01.05.2015, 14:40 | |
01.05.2015, 14:40 | |
Помогаю со студенческими работами здесь
10
dynamic_cast dynamic_cast Dynamic_cast dynamic_cast Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |