· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Вызов абстрактого метода

Посл.отвђт Сообщенiе


Дата: Май 9, 2004 09:38:15 · Поправил: Eraser

Как правильно найти и вызвать абстрактный метод?
Например фунуция:
function ReadByteSt(S:TStream):byte;assembler;
asm
  здесь код
  .
  .
  .

end;


call TStream.Read - я не могу сделать программа сразу ругается что метод абстрактный!


Дата: Май 9, 2004 09:40:40

Кстати с праздником всех!!!


Дата: Май 9, 2004 12:06:02

Насколько я понял это код на паскале, который я уже порядком подзабыл. Но чтобы вызвать какой-то метод, он должен быть реальным. Абстрактный метод вызвать нельзя, надо наследовать от него реальный метод.

ЗЫ: Все это большое ИМХО, т.к. с ООП я знаком весьма поверхностно.


Дата: Май 9, 2004 13:55:28

Именно, именно! Программа и должна ругаться. Абстрактный метод абстрактен, т.е. в базовом классе не реализован.


Дата: Май 9, 2004 15:14:36

Eraser:
аналог на С++ это :
virtual FOO()=0;
и что ты вызывать будешь? функции не существует (это и значет абстрактный метод). По С++-ному это называется Pure Virtual Function. В VTBL нет указателя на реализацию функции . По той причине, что реализации функции нет.


Дата: Май 9, 2004 15:45:59

Так нужно call S.Read а не call TStream.Read
ведь TStream - это тип данных...


Дата: Май 9, 2004 19:04:08

DaemoniacaL
Но и реализовать функцию не помешает, а то виртуальная функция - это слишком мало. :)


Дата: Май 10, 2004 06:42:22

Я понял, что метода не существует, но функция будет работать если её написать так:
function ReadByteSt(S:TStream):byte;
begin
  S.Read(Result,SizeOf(Result));
end;


S сожет быть и TMemoryStream и TFileStream короче любым Stream'ом и ведь программа, а не компилятор определяет "S": что это за потомок и где его настоящая функция Read. Я смотрел на ассемблерный код функции ни чего не понял. Насколько я знаю есть таблица толи VMT толи DMT (виртуальная/динамическая) и в ней можно наити адрес нужной мне функции Read в зависимости какой потомок TStream будет в "S". Но как конкретно не знаю, пол нета облазил!


Дата: Май 11, 2004 13:45:24

;для S.Read(Result,SizeOf(Result)) делфи генерит примерно следующее
;eax = S ("нулевой" параметр - Self)
........
push ecx        ;Место для результата
mov  edx, esp   ;Первый параметр - var Buffer
mov  ecx, SizeOf(Byte) ;Второй параметр - Count
mov  ebx, [eax] ;В ebx - указатель на VMT
call [ebx+4]    ;4 - это и есть смещение Read
mov  al, [esp]  ;Result<-Buffer
........

Как задать смещение цивилизованным образом, я не знаю :(
Посмотри, как реализована TObject.Free (в System)
и в Help'е делфовском набери VMT

И вообще в данном случае используй ReadBuffer :)


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.308