Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
3-9081
bsa
2002-02-05 15:56
2002.03.04
Как быть с циклическими ссылками в таблицах??


3-9093
harismatik
2002-02-06 16:35
2002.03.04
Шестнадцатиричные значения в базе


3-9068
Questioner
2002-02-06 15:23
2002.03.04
Люди уверен, что все каким-либо образом решали для себя эту задачу.


3-9077
dimich
2002-02-06 11:34
2002.03.04
InterBase Server


1-9214
skywalker
2002-02-14 19:05
2002.03.04
Данные динамического массива





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский