Форум: "Потрепаться";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.04;
Скачать: [xml.tar.bz2];




Вниз

TObject - сам себя??? :) 


Val   (2002-01-16 10:53) [0]

Быть может кого-то этот вопрос заинтересует(на мой взгляд оригинален), наверняка кто-то знает ответ...:)
Известно, что при объявлении класса, если предок не указан явно, то этим самым подразумевается, что его предок TObject..., но ведь и TObject объявлен как TObject = class; получается - он сам свой родитель???



Алексей Петров   (2002-01-16 11:26) [1]

В VMT родитель TObject-а - nil.

Компилятор немного иначе обрабатывает объявление TObject-а, по всей видимости.



EAlexander   (2002-01-16 11:46) [2]

компилятоз знает, что делать со словами constructor , destructor и т.д. :)



Val   (2002-01-16 12:13) [3]

Нельзя ли подробнее?
У TObject, как у класса-абстракции, они пустые, у его наследников обычно происходит инициализация полей относящихся к предку с помощью inherited Create; но как это объясняет...?



Алексей Петров   (2002-01-16 12:35) [4]

Конструктор кроме своего тела содержит еще код, выделяющий и инициализирующий память под экземпляр объекта. Этот код компилятор генерит, увидев слово constructor.

А вызов inherited Create, если тот пустой, реально ничаго не делает (кроме скачков EIP).



EAlexander   (2002-01-16 12:37) [5]

включить use debug info и вперед по F7 - можно увидеть, что РЕАЛЬНО происходит при вызове виртуальных, динамических и т.п ,
т.е. посмотреть asm+pas подставки, которые делает компилятор или что-то вроде препроцессора (не путать с препроцессором C++ - там это вполне четкое понятие).



Val   (2002-01-16 13:51) [6]

Но объявление TObject? Как это может быть связано с методами? Быть может эта функция класса является зацепкой/объяснением? Признаюсь, не особо понимаю ее внутренностей :(

class function TObject.ClassParent: TClass;
asm
MOV EAX,[EAX].vmtParent
TEST EAX,EAX
JE @@exit
MOV EAX,[EAX]
@@exit:
end;



EAlexander   (2002-01-16 13:59) [7]

"при вызове виртуальных, динамических и т.п " я имел в виду и constructorы и destructorы, даже при операции строка1 + строка2 вызывается недетский кусок asm

Просто delphi очень много очень низкоуровневых :) операций скрывает от программиста, даже думать об этом не надо.
но если интересно, то можно по use debug info + F7 посмотреть, что происходит реально хотя бы при создании любого объекта.
понять там что-нибудь очень не просто. И ОНО НАДО ЛИ ? :):)
Borland подумал об этом в 94-96 годах и очень хорошо подумал (MS в VB.NET только обещает динамическое создание компонтов, наследование и т.п. виши, которое всегда были в Delphi, C++)



limon   (2002-01-16 15:13) [8]

> Val © (16.01.02 13:51)
Буквально это означает следующее:
в EAX - адрес текущего объекта, иначе:
var EAX :TObjectRecord
EAX := EAX.vmtParent;
if EAX = nil then exit;
EAX := EAX.ParentAddress;
end;


Грубо и не совсем точно, но суть в этом.
Специфичные для TObject операции расписаны в system.pas ассемблерными вставками.
А TObject.Create & Destroy - пустые процедуры.
Смысл их только в том, что объявлены как конструктор и деструктор, а это прерогатива компилятора (см. EAlexander © (16.01.02 13:59))




Форум: "Потрепаться";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.04;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.021 c
1-9120            Марина                2002-02-04 16:25  2002.03.04  
MessageDlg


1-9137            LLL                   2002-02-16 20:04  2002.03.04  
Рамка для компонента


7-9312            UN9GW                 2001-11-29 21:46  2002.03.04  
как получить данные извне с регистра 0x378 LPT порта?


6-9262            Alligator             2001-12-13 15:15  2002.03.04  
ClientSocket >>как перекачать файл <<ServerSocket?


3-9092            HDD                   2002-02-05 16:13  2002.03.04  
Люди добрые помогите пожалуйста