![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
mes |
|
||||||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
хотелось бы уточнить что не верно .. под фразой "нельзя применять" подразумевалось, что нельзя получить ожидаемый (т.е такой какой был бы в случае обладания классом виртуальной функции) результат, а не то что применение каста вызовет ошибку компиляции либо рантайма.. Т.е. "нельзя" в роли "бесполезно", a не "невозможно" или "строжайше запрещено" ![]() все еще неверно ? или речь про это ?
т.е. то что отсутствие именно виртуальной таблицы упоминается как причина ? P.S.по-мойму форум глючит .. старые темы с новыми датами всплыли.. и комменты некоторые почему то изменились.. Это сообщение отредактировал(а) mes - 31.10.2009, 21:28 |
||||||||
|
|||||||||
UnrealMan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Чтобы говорить о требованиях к операнду dynamic_cast и внутренней реализации преобразования, надо бы уточнить, какое именно преобразование рассматривается (а в случае с реализаций ещё и компиляторы). dynamic_cast не всегда использует RTTI. |
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
A..ну теперь вроде понятно что куда Вы клоните..Перечитал тему еще раз - действительно выглядит не связано.. Попробую расставить на свои места : Вначале я думал что топикстартера интересует : ответом было : после, заметив слово "RTTI" в названии, я предположил что интересует обратное преобразование (т.е. downcast), потому как для приведенного в примере информации достаточно и на этапе компиляции.. Но явно я забыл это указать, (если быть точнее я не хотел запутывать тс еще больше), сократив мысль до такой : и в дальнейшем dynamic_cast подразумевался именно как инструмент downcasta. Теперь попытаюсь исправить те два вранья :
следует читать : нельзя произвести downcast с проверкой рантайма к объектам таких классов.. сам же dynamic_cast однако можно использовать для их (объектов) upcasta и crosscasta.
Естественно само описание с участием ВМТ используются условно как частный случай реализации. UnrealMan, я правильно понял, что Вы имели ввиду ? Это сообщение отредактировал(а) mes - 1.11.2009, 14:33 |
||||
|
|||||
UnrealMan |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
RTTI может ещё использоваться для crosscast'а и приведения к void*. Для upcast'а RTTI не нужна.
А если мы к ссылке приводим, то в этом случае тоже нулевой указатель может возвращаться? ![]() P.S. А-а-а, мне запретили рейтинговать ![]() ![]() Это сообщение отредактировал(а) UnrealMan - 1.11.2009, 16:37 |
||||
|
|||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
спасибо, этого не знал и даже не подозревал.. Надо будет покапать в этом направлении..
В предыдущем посте я пытался донести, что обсуждении с тс было посвящено не возможностям dynamic_cast и требований к этому оператору, более того сам dynamic_cast имел отношение к разговору только лишь потому, что является инструментом для некоторых преобразований.. А обсуждалось каким образом компилятор может узнать о возможности правильного преобразования одного типа к другому (в том числе и в рантайме). А так я в курсе, что неудачный dynamic_cast для ссылки возбуждает исключение. ![]() |
||||
|
|||||
DrHex |
|
||||||||||||||||||||||||||||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 2.5.2009 Репутация: нет Всего: нет |
Книжная теория это всего лишь слова.
Пример vs2008
На выходе в релизной версии имеем
Для тех кто не понимает
Происходит заряд виртуальной таблицы....
Пырвый вызов функции (a->func1();) Так как указатель на функцию идет первым(dword ptr [eax],offset C::`vftable' (402138h) ) соответственно вызов происходит по указателю(в нашем без смещений от объекта, то и есть кастинг бых выполнен в стиле "С")
esi+8 смещение на вось байт. Почему на восемь??? указатель на функцию(4 байта) + поле (4 байта) и того восемь. То и есть приведение было в стиле "С" и смещение на восемь байт. В дебажном варианте тоже не всегда можно удидеть RTTI
Ключевой момент(Смещение указателя)
Вот другое дело что взять да и убрать public наследование то и есть меняем
на
И видем картину A* a = dynamic_cast<A*>©;
___RTDynamicCast
Стандартный для студии пролог....
Установка SEH(catch)
Есче(еще для умных) SEH. Опистим детали(это же не учебник) Один из ключевых моментов FindMITargetTypeInstance должен вернуть указатель на объект
jmp __RTDynamicCast+0F1h делает переход на
Как видим функция должна вернуть не ноль что бы условного переход не было, если условный переход(je __RTDynamicCast+112h (102B33B2h) ) произойдет, то будет вызвана ошибка(генерация исключения на сколько помню...) --------------------
google.com и это все. |
||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||
Graf_h |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 482 Регистрация: 18.10.2007 Где: г. Ровно, Украина Репутация: 2 Всего: 5 |
mes скажите пожалуйста, как можно получиь таблицу парента, по текущей вирт таблице. Я как не пыался, не получилось ( -------------------- Иногда переменная - это просто переменная |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
даже наличие таблицы, не говоря о том как она устроена - implementation defined, а значит вопрос должен как минимум упоминать конкретный компилятор. ну а если в рамках пользователя С++, то такой вопрос не должен интересовать. для этого нужно знать структуру VMT, ну и по какому смещению она расположена (для нахождения текущей) |
|||
|
||||
Graf_h |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 482 Регистрация: 18.10.2007 Где: г. Ровно, Украина Репутация: 2 Всего: 5 |
Почему? Если, к примеру, мне нужен свой dynamic_cast? -------------------- Иногда переменная - это просто переменная |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
потому что такое возможно либо узкоспециализированное - под каждый компилятор свое, либо составлять свою таблицу - такой путь предпочтительней.. |
|||
|
||||
Graf_h |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 482 Регистрация: 18.10.2007 Где: г. Ровно, Украина Репутация: 2 Всего: 5 |
mes, спасибо
![]() -------------------- Иногда переменная - это просто переменная |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |