Форум: "Потрепаться";
Текущий архив: 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))
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2002.03.04;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.004 c