34 / 10 / 2
Регистрация: 20.02.2016
Сообщений: 1,556
|
|||||||||||
1 | |||||||||||
Что возвращает dynamic_cast?22.10.2018, 21:50. Показов 1890. Ответов 14
Метки нет (Все метки)
Доброго времени суток!
Знакомлюсь с dynamic_cast . Почитал кое-что и в википедии. И нашёл там такое:В случае если осуществляется преобразование указателя, который содержит адрес объекта-родителя, к указателю типа объекта-потомка, то в результате преобразования будет получен нулевой указатель. То есть возвращается ноль, правильно? Например:
true , я прав?
0
|
22.10.2018, 21:50 | |
Ответы с готовыми решениями:
14
dynamic_cast<X&>(Y) что в результате? Вызов виртуальной функции vs несколько dynamic_cast подряд: что быстрее? Определить, что за параметр передается функции и что она возвращает Что означает запись в скобках и что возвращает return |
18775 / 9786 / 2394
Регистрация: 30.01.2014
Сообщений: 17,178
|
|
22.10.2018, 22:06 | 3 |
Посмотрел я историю правок. Это какой-то несознательный человек исправил проверенную версию.
Изначально там было так: Отсюда только один вывод. Книги надо читать, а не википедию
2
|
Комп_Оратор)
|
||||||
22.10.2018, 22:18 | 4 | |||||
nullptr то явно преобразуется к false . иначе к true . То есть, механизм получения булевого значения тут отличается от того, что получился бы при использовании оператора сравнения на равенство так же как == отличается от = .Добавлено через 6 минут Вообще, я не стал придавать значения типам Base и Deriv полагая это набором символов. Хотя конечно, под вечер не хочется таких шпилек.
1
|
863 / 451 / 89
Регистрация: 10.06.2014
Сообщений: 2,643
|
|
22.10.2018, 22:42 | 5 |
Если преобразовываете в указатель то вернёт указатель, если в ссылку то ссылку.
Если каст не удался, в случае указателей возвращается nullptr В случае ссылки получите исключение std::bad_cast
1
|
DrOffset
|
22.10.2018, 22:50
#6
|
0
|
IGPIGP
|
23.10.2018, 08:39
#7
|
0
|
Вездепух
11653 / 6336 / 1719
Регистрация: 18.10.2014
Сообщений: 15,994
|
|
23.10.2018, 11:17 | 8 |
Во-первых, использование
dynamic_cast для выполнения преобразования вниз (от Base * к Derv * ) допускается только в том случае, если исходный указатель указывает на полиморфный класс. То если если ваше Base не является полиморфным классом, то dynamic_cast<Derv*>(pbase) вообще не скомпилируется.Во-вторых, если pbase указывает на доступный базовый подобъект объекта типа Derv и последний однозначно определен, то будет выполнено корректное преобразования вниз от Base * к Derv * . Для таких преобразований и существует dynamic_cast .В приведенной же вами цитате из Википедии написана полнейшая чушь. Добавлено через 1 минуту Хм... Да, там делается попытка именно преобразовать указатель родителя к указателю наследника.
2
|
34 / 10 / 2
Регистрация: 20.02.2016
Сообщений: 1,556
|
|
23.10.2018, 19:01 [ТС] | 9 |
0
|
Вездепух
11653 / 6336 / 1719
Регистрация: 18.10.2014
Сообщений: 15,994
|
|
23.10.2018, 19:04 | 10 |
В каком смысле "неправильно"? Можно говорить о том, что это плохой дизайн, как и почти все явные преобразования. Но в остальном ничего неправильного тут нет. Как раз наоборот, именно для таких преобразований dynamic_cast и предназначен, как я уже писал выше.
Формально "неправильным" этот каст будет только в том случае, если базовый класс не полиморфен.
2
|
Комп_Оратор)
|
||||||
23.10.2018, 19:29 | 11 | |||||
TheCalligrapher, я тогда не понял что там делается, так как сначала написал как получается булево значение а потом видя пост DrOffset, ещё раз глянул в код, но поспешил. Тем не менее я до сих пор не понимаю зачем там локальная переменная. Так разве нельзя:
(лучше бы указатель вернуть, а потом проверить и использовать, если живой). И чем плох сам if(...) прямо в месте вызова?
0
|
Неэпический
|
||||||
23.10.2018, 20:19 | 12 | |||||
Выглядит как-то не очень.
Я до сих пор не понимаю зачем там функция. Так разве нельзя:
0
|
34 / 10 / 2
Регистрация: 20.02.2016
Сообщений: 1,556
|
|||||||||||
18.11.2018, 22:42 [ТС] | 14 | ||||||||||
Почему используется
dynamic_cast ? Код в ниже
dynamic_cast ?
0
|
18.11.2018, 22:59 | 15 |
Fatmarmelad,
спокойно, я думал ты с == перепутал - это была бы совсем детская ошибка для юзера учившего С++ 2 года...
Добавлено через 14 минут можно, и смысл тогда в этом? Ты принимаешь указатель и сразу же переписываешь его на новый объект? Ну и перепишешь ты его и что? Только память зря утечёт. Определение типа то тут каким боком будет? Ты просто присваиваешь одному указателю на Derv другой указатель на Derv - это всегда будет true! Это просто присвоение, а не проверка никакая.
2
|
18.11.2018, 22:59 | |
18.11.2018, 22:59 | |
Помогаю со студенческими работами здесь
15
Что возвращает функция? Что возвращает функция? Что возвращает функция? Что возвращает операто NEW Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |