Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.11;
Скачать: CL | DM;

Вниз

И снова про вызовы функций-членов   Найти похожие ветки 

 
reonid ©   (2002-03-27 17:08) [2]

Такая задача, насколько я её понял, стандартными языковыми средствами не предусмотрена.
Но можно найти положение виртуального метода в VMT и соответственно получить его адрес для любого производного класса:

type
PPtrArray = ^TPtrArray;
TPtrArray = array[0..MaxInd div 16] of Pointer;

TBase = class
function F; virtual; abstract;
end;

var vmt, pf: Pointer;
i, vmtIdx: Integer;
meth: TMethod;
derived: TBase;// Потомок

pf := @TBase.F;

vmtIdx := -1; // Ищем позицию метода в VMT
i := 0;
vmt := TBase;
repeat
if PPtrArray(vmt)^[i] = pf then
begin
vmtIdx := i;
Break;
end;
Inc(i);
until False;

meth.data := derived;
meth.code := PPtrArray(derived.ClassType)^[vmtIdx]; // находждениее адреса метода по индексу в VMT

meth(); // Выполнение



Страницы: 1 вся ветка

Текущий архив: 2002.04.11;
Скачать: CL | DM;

Наверх




Память: 0.46 MB
Время: 0.017 c
14-32945
Yaro
2002-01-27 07:55
2002.04.11
Кто в какой ОС работает?


3-32637
AndrewK
2002-03-19 12:54
2002.04.11
Работа с ADO


1-32847
IronHawk
2002-03-27 17:15
2002.04.11
Как мне с моей прогой перенести и BDE 4.xx скопирить на другой ком и при етом шоб всё работало ?


1-32901
Clon
2002-03-29 20:26
2002.04.11
Необходимо реализовать Drag&Drop из TDBGrid в другой контрол...


3-32657
Брат
2002-03-20 09:10
2002.04.11
Не открывается таблица....