Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> dynamic в VC, Есть ли в VC dynamic метода как в Delphi 
:(
    Опции темы
dead_ricky
Дата 14.9.2002, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 4.4.2002

Репутация: нет
Всего: 1



Эта... типа вот насколько я знаю если в классе предке обявить несколько методов виртуальными, то потом (вроде бы во время выполнения) будет создана VMT, как для текущего класса (объекта), так и для классов потомков, которые наследуют эти методы. Причем VMT будет создаваться не зависимо от того перекрывался ли виртуальный метод в классе потомке или нет, т.е происходит дублирование адрессов.
 Так вот в Delphi есть такая штука, как dynamic - методы. Для них это дело (VMT) создается только если метод в классе потомке был перекрыт. А в VC как есть че нить подобное? а?
PM MAIL   Вверх
Sun
Дата 20.9.2002, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Account removed
***


Профиль
Группа: Экс. модератор
Сообщений: 1611
Регистрация: 14.8.2002

Репутация: нет
Всего: 48



Ну слушай с таким стилем постановки вопроса тебя надо взять к нам в support для избавления от нежелаемых клиентов. :)
В C++ если метод объявлен как виртуальный то для него будет создана таблица виртуальных функций.
На сколько я смотрел в отладчике - для неперекрытых функций дублирования не происходит. Указатель на неперекрытую функцию в текущем классе ссылается на функцию потомка в котором она была перекрыта либо впервые объявлена.
А вообще парить себе голову такой фигней - это занятие для девелоперов из Microsoft.


--------------------
Account removed
PM MAIL   Вверх
Le Taon
Дата 27.9.2002, 06:59 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата
для неперекрытых функций дублирования не происходит.


Для тех, кто не знаком с понятием динамических методов объясняю:
Предположим, у тебя базовый класс с 10 виртуальными методами.
Если у него есть 10 потомков и ни один из них не перекрывает ни одного из методов, на их VMT (или VTable, как угодно) всё равно будет израсходовано 10*10*4 байта. (Ведь у каждого класса своя VMT, хоть у всех они совершенно одинаковые).

В отличие от виртуальных методов, динамические методы привязаны не к смещению в VMT, а к некоторому числу, т.н. селектору.
Существует таблица динамических методов DMT - ссылка на неё саму хранится в VMT (по смыслу - ассотиативный массив map<signed short selector, void * pfunc>), в которой по селектору
можно найти требуемый метод. Если бы в исходном примере 10 методов были бы динамическими, то DMT была бы только у базового класса, у потомков её не было бы.
Поиск производится сначала в DMT класса, потом в DMT предка, потом в DMT предка предка и т.д., пока исходный метод не находится.

Т.о. экономия памяти защ счёт быстродействия.

На самом деле основная польза от динамических методов вовсе не в экономии памяти (кто в наше время память экономит), а в том, что через них очень красиво реализованы обработчики сообщений (вместо всяких макросов и карт сообщений можно просто написать

procedure WMUser(var Msg: TMessage); message WM_USER;
// динамический метод с селектором = WM_USER

).

Ах да, чуть не забыл:
в VC их нет.
  Вверх
Fantasist
Дата 1.10.2002, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Цитата
Ах да, чуть не забыл:
в VC их нет.


:D
Классно!

Добавим для полноты, что в спецификации С++ они тоже не присутствуют.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Le Taon
Дата 1.10.2002, 23:03 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











:D

Цитата
Добавим для полноты, что в спецификации С++ они тоже не присутствуют.


Так я ж объяснял, как они в Дельфях реализованы.
Просто у меня сложилось впечатление, что люди не очень понимают,
о чём они говорят.

А вообще, они со множественным наследованием несовместимы.
(Я кстати где-то читал, что в Objective C было что-то подобное, хотя гарантировать не берусь).
  Вверх
Fantasist
Дата 2.10.2002, 05:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Цитата
Так я ж объяснял, как они в Дельфях реализованы.


Это понятно, я к тому, что привыкаешь разделять компилятор и стандарт С++. Например, VC50 не поддерживает throw, но тем не менее в стандарте такой механизм обрисован (может, конечно, на тот момент этого там не было).
Некоторые среды, (хотя бы тот же Builder, да и VC тоже) добавляют свои спецификации к языку. Это вам прекрасно известно. По этому я и скзал, "для полноты".


--------------------
Волны гасят ветер...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0869 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.