|
|
| Посл.отвђт | Сообщен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 |