34 / 10 / 2
Регистрация: 20.02.2016
Сообщений: 1,556
1

Что возвращает dynamic_cast?

22.10.2018, 21:50. Показов 1890. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток!
Знакомлюсь с dynamic_cast. Почитал кое-что и в википедии. И нашёл там такое:
В случае если осуществляется преобразование указателя, который содержит адрес объекта-родителя, к указателю типа объекта-потомка, то в результате преобразования будет получен нулевой указатель.
То есть возвращается ноль, правильно?
Например:
C++
1
class Derv:public Base

C++
1
2
3
4
5
6
7
8
bool func(Base* pbase) 
{
Derv* pDerv;
If (pDerv = dynamic_cast<Derv*>(pbase))//Равносильно if(NULL), правильно?
return true;
else
return false;
}
Значит , если получен ноль возвращается true, я прав?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.10.2018, 21:50
Ответы с готовыми решениями:

dynamic_cast<X&>(Y) что в результате?
Попытка привести указатель на один класс к указателю на другой (несовместимый) в результате получим...

Вызов виртуальной функции vs несколько dynamic_cast подряд: что быстрее?
Нужно максимально оптимизировать программу вот и пал выбор: лучше сделать чтобы вызывались...

Определить, что за параметр передается функции и что она возвращает
Добрый день! помогите пожалуста понять что за параметр передается функции LS_GetReaderSn и что...

Что означает запись в скобках и что возвращает return
Всем привет! Начал читать книгу BecomeAnXcoder и тут появился вопрос. В пример приведен такой код...

14
4063 / 3317 / 924
Регистрация: 25.03.2012
Сообщений: 12,483
Записей в блоге: 1
22.10.2018, 21:51 2
наоборот
1
18775 / 9786 / 2394
Регистрация: 30.01.2014
Сообщений: 17,178
22.10.2018, 22:06 3
Цитата Сообщение от Fatmarmelad Посмотреть сообщение
В случае если осуществляется преобразование указателя, который содержит адрес объекта-родителя, к указателю типа объекта-потомка, то в результате преобразования будет получен нулевой указатель.
Посмотрел я историю правок. Это какой-то несознательный человек исправил проверенную версию.
Изначально там было так:
В случае, если осуществляется преобразование указателя к типу данных, который не является фактическим типом объекта, в результате преобразования будет получен нулевой указатель.
Эта версия, конечно, тоже неидеальна, но, по крайней мере в общих чертах, истине соответствует.
Отсюда только один вывод. Книги надо читать, а не википедию
2
Комп_Оратор)
Эксперт по математике/физике
8945 / 4699 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
22.10.2018, 22:18 4
C++
1
pDerv = dynamic_cast<Derv*>(pbase)
оператор присваивания возвращает ссылку на результат. При обращении ссылка возвращает значение, в данном случае. Если оно nullptr то явно преобразуется к false. иначе к true. То есть, механизм получения булевого значения тут отличается от того, что получился бы при использовании оператора сравнения на равенство так же как == отличается от =.

Добавлено через 6 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
Посмотрел я историю правок. Это какой-то несознательный человек исправил проверенную версию.
Вообще, я не стал придавать значения типам 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

Не по теме:

Цитата Сообщение от IGPIGP Посмотреть сообщение
Вообще, я не стал придавать значения типам Base и Deriv полагая это набором символов. Хотя конечно, под вечер не хочется таких шпилек.
Честно говоря, я не понял к чему вы это написали.

0
IGPIGP
23.10.2018, 08:39
  #7

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
Честно говоря, я не понял к чему вы это написали.
С утра вижу, что зря написал. Вчера показалось, что предпринята попытка преобразовать указатель родителя к указателю наследника. Прошу прощения, Fatmarmelad.

0
Вездепух
Эксперт CЭксперт С++
11653 / 6336 / 1719
Регистрация: 18.10.2014
Сообщений: 15,994
23.10.2018, 11:17 8
Цитата Сообщение от Fatmarmelad Посмотреть сообщение
Знакомлюсь с dynamic_cast. Почитал кое-что и в википедии. И нашёл там такое:
В случае если осуществляется преобразование указателя, который содержит адрес объекта-родителя, к указателю типа объекта-потомка, то в результате преобразования будет получен нулевой указатель.
То есть возвращается ноль, правильно?
Во-первых, использование dynamic_cast для выполнения преобразования вниз (от Base * к Derv *) допускается только в том случае, если исходный указатель указывает на полиморфный класс. То если если ваше Base не является полиморфным классом, то dynamic_cast<Derv*>(pbase) вообще не скомпилируется.

Во-вторых, если pbase указывает на доступный базовый подобъект объекта типа Derv и последний однозначно определен, то будет выполнено корректное преобразования вниз от Base * к Derv *. Для таких преобразований и существует dynamic_cast.

В приведенной же вами цитате из Википедии написана полнейшая чушь.

Добавлено через 1 минуту
Цитата Сообщение от IGPIGP Посмотреть сообщение
Вчера показалось, что предпринята попытка преобразовать указатель родителя к указателю наследника.
Хм... Да, там делается попытка именно преобразовать указатель родителя к указателю наследника.
2
34 / 10 / 2
Регистрация: 20.02.2016
Сообщений: 1,556
23.10.2018, 19:01  [ТС] 9
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Хм... Да, там делается попытка именно преобразовать указатель родителя к указателю наследника.
а это неправильно?
0
Вездепух
Эксперт CЭксперт С++
11653 / 6336 / 1719
Регистрация: 18.10.2014
Сообщений: 15,994
23.10.2018, 19:04 10
Цитата Сообщение от Fatmarmelad Посмотреть сообщение
а это неправильно?
В каком смысле "неправильно"? Можно говорить о том, что это плохой дизайн, как и почти все явные преобразования. Но в остальном ничего неправильного тут нет. Как раз наоборот, именно для таких преобразований dynamic_cast и предназначен, как я уже писал выше.

Формально "неправильным" этот каст будет только в том случае, если базовый класс не полиморфен.
2
Комп_Оратор)
Эксперт по математике/физике
8945 / 4699 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
23.10.2018, 19:29 11
TheCalligrapher, я тогда не понял что там делается, так как сначала написал как получается булево значение а потом видя пост DrOffset, ещё раз глянул в код, но поспешил. Тем не менее я до сих пор не понимаю зачем там локальная переменная. Так разве нельзя:
C++
1
2
3
4
bool func(Base* pbase) 
{
return dynamic_cast<Derv*>(pbase));
}
?
(лучше бы указатель вернуть, а потом проверить и использовать, если живой). И чем плох сам if(...) прямо в месте вызова?
0
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
23.10.2018, 20:19 12
Цитата Сообщение от IGPIGP Посмотреть сообщение
я до сих пор не понимаю зачем там локальная переменная. Так разве нельзя
Выглядит как-то не очень.
Я до сих пор не понимаю зачем там функция. Так разве нельзя:
C++
1
bool success = dynamic_cast<Derv*>(ptr)//вместо вызова функции
Цитата Сообщение от IGPIGP Посмотреть сообщение
И чем плох сам if(...) прямо в месте вызова?
Таким образом скоро дойдем до "зачем там класс" и "зачем вообще нужны функции".
0
Комп_Оратор)
Эксперт по математике/физике
8945 / 4699 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
23.10.2018, 22:18 13
Цитата Сообщение от Croessmah Посмотреть сообщение
//вместо вызова функции
Лучше указатель. А потом его проверить.
Цитата Сообщение от Croessmah Посмотреть сообщение
Таким образом скоро дойдем до "зачем там класс" и "зачем вообще нужны функции".
"Вообще", это преувеличение вплоть до потери смысла. Я говорил о данной функции и всё.
0
34 / 10 / 2
Регистрация: 20.02.2016
Сообщений: 1,556
18.11.2018, 22:42  [ТС] 14
Почему используется dynamic_cast? Код в ниже
C++
1
2
3
4
5
6
7
8
bool func(Base* pbase) 
{
Derv* pDerv;
If (pDerv = dynamic_cast<Derv*>(pbase))//Равносильно if(NULL), правильно?
return true;
else
return false;
}
нельзя ли просто прописать вот так ?
C++
1
2
3
4
5
6
7
8
bool func(Derv* pD2) 
{
Derv* pDerv=new Derv;
If (pD2=pDerv)//  Просто напросто в функции присвоить одному указателю значение указателя того же типа?
return true;
else
return false;
}
И на практике ведь такая проверка проходит. Для чего нужен тогда dynamic_cast?
0
4063 / 3317 / 924
Регистрация: 25.03.2012
Сообщений: 12,483
Записей в блоге: 1
18.11.2018, 22:59 15
Fatmarmelad,
Цитата Сообщение от Fatmarmelad Посмотреть сообщение
If (pD2=pDerv)
спокойно, я думал ты с == перепутал - это была бы совсем детская ошибка для юзера учившего С++ 2 года...

Добавлено через 14 минут
Цитата Сообщение от Fatmarmelad Посмотреть сообщение
нельзя ли просто прописать вот так ?
можно, и смысл тогда в этом? Ты принимаешь указатель и сразу же переписываешь его на новый объект?
Ну и перепишешь ты его и что? Только память зря утечёт. Определение типа то тут каким боком будет?
Ты просто присваиваешь одному указателю на Derv другой указатель на Derv - это всегда будет true! Это просто присвоение, а не проверка никакая.
2
18.11.2018, 22:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.11.2018, 22:59
Помогаю со студенческими работами здесь

Что возвращает функция?
Доброго времени суток! Прилетела мне задача - восстановить алгоритм задачи из дельфийского кода и...

Что возвращает функция?
Здравствуйте, помогите пожалуйста. Я не знаком с PHP, но стала задача воспроизвести код на .NET. ...

Что возвращает функция?
Была получена программа. Вот одна из функций что там используется: uchar* chess(uchar m,//адрес...

Что возвращает операто NEW
Что возвращает операто NEW ? если не достаточно памяти ??? по ходу НОЛЬ,,,,,,???


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru