Форум: "Потрепаться";
Поиск по всему сайту: 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.018 c
1-9164            Ковекс                2002-02-14 05:28  2002.03.04  
листинг и получение информации о файле


1-9151            Tsatur Soft           2002-02-16 23:35  2002.03.04  
Срочно!


3-9060            amamed_3071           2002-02-06 16:22  2002.03.04  
Create Quickreport


3-9049            sd                    2002-02-06 07:47  2002.03.04  
Возврат значений из скрипта.


4-9347            Beauty_Full           2002-01-03 20:54  2002.03.04  
Принтер и все связанное с ним