![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| dead_ricky |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 4.4.2002 Репутация: нет Всего: 1 |
Эта... типа вот насколько я знаю если в классе предке обявить несколько методов виртуальными, то потом (вроде бы во время выполнения) будет создана VMT, как для текущего класса (объекта), так и для классов потомков, которые наследуют эти методы. Причем VMT будет создаваться не зависимо от того перекрывался ли виртуальный метод в классе потомке или нет, т.е происходит дублирование адрессов.
Так вот в Delphi есть такая штука, как dynamic - методы. Для них это дело (VMT) создается только если метод в классе потомке был перекрыт. А в VC как есть че нить подобное? а? |
|||
|
||||
| Sun |
|
|||
|
Account removed ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1611 Регистрация: 14.8.2002 Репутация: нет Всего: 48 |
Ну слушай с таким стилем постановки вопроса тебя надо взять к нам в support для избавления от нежелаемых клиентов.
В C++ если метод объявлен как виртуальный то для него будет создана таблица виртуальных функций. На сколько я смотрел в отладчике - для неперекрытых функций дублирования не происходит. Указатель на неперекрытую функцию в текущем классе ссылается на функцию потомка в котором она была перекрыта либо впервые объявлена. А вообще парить себе голову такой фигней - это занятие для девелоперов из Microsoft. -------------------- Account removed |
|||
|
||||
| Le Taon |
|
|||
|
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 |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Классно! Добавим для полноты, что в спецификации С++ они тоже не присутствуют. -------------------- Волны гасят ветер... |
|||
|
||||
| Le Taon |
|
|||
|
Unregistered |
Так я ж объяснял, как они в Дельфях реализованы. Просто у меня сложилось впечатление, что люди не очень понимают, о чём они говорят. А вообще, они со множественным наследованием несовместимы. (Я кстати где-то читал, что в Objective C было что-то подобное, хотя гарантировать не берусь). |
|||
|
||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Это понятно, я к тому, что привыкаешь разделять компилятор и стандарт С++. Например, VC50 не поддерживает throw, но тем не менее в стандарте такой механизм обрисован (может, конечно, на тот момент этого там не было). Некоторые среды, (хотя бы тот же Builder, да и VC тоже) добавляют свои спецификации к языку. Это вам прекрасно известно. По этому я и скзал, "для полноты". -------------------- Волны гасят ветер... |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |