Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
правильно меркуешь, Карп 27.07.01 03:07 Число просмотров: 1720
Автор: kabanchik Статус: Незарегистрированный пользователь
|
> > конечно же можно включить в main(). но повторюсь - > цель - > > разрушить дочернюю таблицу виртуальных ф-ий и создать > > родительский. > Именно так все и происходит, хорош народ пужать ;)) этих не напугаешь :-)
> > В общем, исследование кода сгенерированного VC++ 6.0 > показало, что при использовании ссылки или указателя > генерируется переадресация через vtbl и т.п., а при > непосредственном обращении к объекту вызывается... > Child::PrintMsg() ! Т.е., компилятор НАГЛО ИГНОРИРУЕТ vtbl > вообще! я вот о чем еще думал - это ошибка компилятора или линкера?
> > Фенька, похоже, в том, что при вызове метода через ссылку > или указатель компилятор не имеет права делать > предположений о типе объекта, к которому попадет вызов и, > следовательно, создает код, обрабатывающий vtbl, что, в > общем, совершенно верно и в твоем примере приводит к вызову > Parrent::PrintMsg(). > > Другое дело, если компилятор при вызове метода ТОЧНО ЗНАЕТ > ТИП ОБЪЕКТА (или, во всяком случае, он так считает ;) ). > По-видимому, он предполагает, что тип не может измениться > во время существования объекта и по этому поводу на разборе > vtbl можно сэкономить. На мой взгляд, такое поведение > вполне логично для языка со статической типизацией, хотя и > оставляет возможности для целой кучи разнообразных трюков.
не знаю точно, но чую что так не правильно. скорее всего у объекта должен быть vtbl, который меняется. и не в зависимости ни от чего - знает объект свой тип или нет - если вызывается виртуальная ф-ия, то вызов идет через vtbl. короче посмотри мой мессаг с примерами to c0x@mail.ru где то в конце нитки.
самое страшное, то что думаю что тут халтура, сжульничали, т.е.
все знают, что виртуальные ф-ии замедляют работу. вот по этому, компании в гонках за славой - типа наш откомпилиный код выполняется во столько раз быстрее - просто вшили в объект ф-ии как самые простые и НАГЛО проигнорировали vtbl. никому и в голову не пришло бы в Child child - e vtbl менять.
в технологии COM паередается указатель не на объект, а на vtbl.
> Однако, остались вопросы: > 1. Что думает по этому поводу Страуструп ? > 2. Что пишет по этому поводу ANSI ? это не знаю
> 3. Как сделаны другие компиляторы? все что попадалось - одно и то же.......
> > > правильно. иначе можно доказать, что *pChild != child; > что > Угу, так и есть :))), только еще хуже: child != child ;) > > > собственно сделал XR. и код который ты показал тоже > верный, > > такое я тоже пробовал. много чего извращенного делал. > но > > разве так и должно быть? виртуальные ф-ии должны быть > > динамичные иначе на хрен они нужны > Виртуальные функции нужны как раз для реализации > полиморфизма обращением через указатель или ссылку.
|
|
|