информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Spanning Tree Protocol: недокументированное применениеГде водятся OGRыАтака на Internet
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
более того 26.07.01 03:12  Число просмотров: 919
Автор: Gesha Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> конечно же можно включить в main(). но повторюсь - цель -
> разрушить дочернюю таблицу виртуальных ф-ий и создать
> родительский.
Именно так все и происходит, хорош народ пужать ;))

В общем, исследование кода сгенерированного VC++ 6.0 показало, что при использовании ссылки или указателя генерируется переадресация через vtbl и т.п., а при непосредственном обращении к объекту вызывается... Child::PrintMsg() ! Т.е., компилятор НАГЛО ИГНОРИРУЕТ vtbl вообще!

Фенька, похоже, в том, что при вызове метода через ссылку или указатель компилятор не имеет права делать предположений о типе объекта, к которому попадет вызов и, следовательно, создает код, обрабатывающий vtbl, что, в общем, совершенно верно и в твоем примере приводит к вызову Parrent::PrintMsg().

Другое дело, если компилятор при вызове метода ТОЧНО ЗНАЕТ ТИП ОБЪЕКТА (или, во всяком случае, он так считает ;) ). По-видимому, он предполагает, что тип не может измениться во время существования объекта и по этому поводу на разборе vtbl можно сэкономить. На мой взгляд, такое поведение вполне логично для языка со статической типизацией, хотя и оставляет возможности для целой кучи разнообразных трюков.
Однако, остались вопросы:
1. Что думает по этому поводу Страуструп ?
2. Что пишет по этому поводу ANSI ?
3. Как сделаны другие компиляторы?

> правильно. иначе можно доказать, что *pChild != child; что
Угу, так и есть :))), только еще хуже: child != child ;)

> собственно сделал XR. и код который ты показал тоже верный,
> такое я тоже пробовал. много чего извращенного делал. но
> разве так и должно быть? виртуальные ф-ии должны быть
> динамичные иначе на хрен они нужны
Виртуальные функции нужны как раз для реализации полиморфизма обращением через указатель или ссылку.
<programming> Поиск 






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach