3 / 3 / 1
Регистрация: 10.11.2012
Сообщений: 63
|
|||||||||||
1 | |||||||||||
dynamic_cast25.10.2013, 15:08. Показов 3034. Ответов 16
Метки нет (Все метки)
Помогите разобраться с dynamic_cast, а точнее с вот этой записью
Или здесь смысл именно в том, чтобы передать в void* адрес класса? Тогда почему не использовать бы какой-нибудь другой каст? P.S: dynamic_cast можно применять только от Derived к Base?
0
|
25.10.2013, 15:08 | |
Ответы с готовыми решениями:
16
Dynamic_cast dynamic_cast dynamic_cast dynamic_cast |
3 / 3 / 1
Регистрация: 10.11.2012
Сообщений: 63
|
||||||
25.10.2013, 15:14 [ТС] | 3 | |||||
Я просто разбираюсь с dynamic_cast, он позволяет работать с классами и void*. И вот возник вопрос, чем void* так выделился.
Добавлено через 1 минуту извиняюсь, там не pa, а pd
0
|
Каратель
|
|
25.10.2013, 15:15 | 4 |
чорд, а я и не знал блин (интересно, где такое пишут? в топку этот источник), а ты знаешь что ножем можно резать хлеб, а можно и пальцы отрезать?
почитай хотя бы в вики про dynamic_cast
0
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|
25.10.2013, 16:47 | 6 |
К void* иногда нужно приводить. При множественном наследовании это позволяет получить указатель на самое начало объекта.
0
|
oxotnik
|
25.10.2013, 16:51
#7
|
Не по теме: не знал, что можно кастить к воиду*
0
|
205 / 165 / 41
Регистрация: 25.10.2013
Сообщений: 527
|
|
25.10.2013, 16:52 | 8 |
Почему при приведении к <void *> не использовать static_cast?
Это намного быстрее.
0
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|
25.10.2013, 16:55 | 10 |
Потому что при множественном наследовании полученный указатель не будет указывать на начало объекта.
0
|
205 / 165 / 41
Регистрация: 25.10.2013
Сообщений: 527
|
|
25.10.2013, 16:59 | 11 |
Не, это я неверно написал, уже исправил. reinterpret_cast нельзя использовать с void* .
Ясно. static_cast это тоже касается?
0
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
||||||
25.10.2013, 17:05 | 12 | |||||
Да. Ни один каст кроме dynamic_cast не использует RTTI.
2
|
25.10.2013, 17:08 | 13 | |||||
А в чем смысл преобразования к типу void * в данном случае?
Добавлено через 3 минуты
0
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|
25.10.2013, 17:14 | 14 |
Ты имеешь в виду зачем нам нужно получать указатель на начало объекта или что?
Ну в твоем коде очевидно, что адреса будут одинаковые. Потому что нет преобразований, которые бы сдвигали указатель (у меня это из C* в B*).
0
|
25.10.2013, 17:23 | 15 | |||||
ct0r, в 12-м посте у меня такой же вывод как и у тебя.. видимо я чего-то недопонимаю.. Чего именно? Почему в функции объект имеет другое "основание" ?
Почему следующий вариант выдает одинаковые значения:
Тьфу, блин.. у тебя ж там другой объект..
0
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|
25.10.2013, 17:25 | 16 |
C* c = new C; - тут c указывает на объект самого производного класса
При вызове функции идет преобразование из C* в B*, после которого с указывает уже на подобъект класса В, который неявно содержится в классе С. Только dynamic_cast пользуется информацией о полиморфных типах, поэтому только он потом может восстановить указатель на самый производный класс. Это полезная фича, когда нам нужно уметь отличать подобъекты одного объекта от других подобъектов. Или при сериализации.
1
|
25.10.2013, 17:27 | 17 |
Я понял что ты хотел сказать. dynamic_cast приводит тип к указателю производного.
0
|
25.10.2013, 17:27 | |
25.10.2013, 17:27 | |
Помогаю со студенческими работами здесь
17
Dynamic_cast реализация Dynamic_cast и полиморфизм Работа с dynamic_cast Объясните dynamic_cast Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |