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

Вниз

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))



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

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

Наверх




Память: 0.48 MB
Время: 0.011 c
1-9201
kingdom
2002-02-14 16:44
2002.03.04
Как сделать мигание формы в свернутом виде?


1-9136
Leshuz
2002-02-16 21:24
2002.03.04
модуль Билдера.


3-9073
DimaIv
2002-02-04 21:37
2002.03.04
Реально ли переделать базу сделанную для использрвания


1-9215
forrest1
2002-02-15 09:57
2002.03.04
Развернуть узел дерева с помощью клавиатуры


1-9200
KS
2002-02-13 15:36
2002.03.04
Borland Delphi