![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Объект nil, а метод вызывается!!!
Grant © (2009-11-27 13:13:00)Всем привет. Объясните пожалуйста следующую осебенность Делфы.
Создаю приложение. Создаю ещё один юнит.
Код юнита:
unit Unit2;
interface
uses
SysUtils, Dialogs;
type
TGrant = class
public
procedure Met;
end;
implementation
procedure TGrant.Met;
begin
ShowMessage('aaa');
end;
end.
На главной форме добавляю в uses новый юнит(unit2) и пишу следующий код обработчика щелчка кнопки:
procedure TForm1.Button1Click(Sender: TObject);
var
vGrant: TGrant;
begin
vGrant.Met;
end;
При отладке переменная vGrant = nil. При этом метод выполняется и выводится на экран окно с сообщением. Вопрос: КАК??? Ведь переменная nil. Заранее спасибо.
Ухарь (2009-11-27 21:22:00) [1]В данном случае (в случае невиртуального метода) его можно рассмотреть как процедуру с неявным параметров Self: TMyObject;
В данном случае она имеет значение nil;
если вы внутри процедуры к этой переменной не обращаетесь, ничего неожиданного и не случится
RWolf (2009-11-27 13:44:00) [2]Виртуальные методы вызываться не будут, т.к. чтобы их вызвать, нужно получить их адрес через VMT, которая заполняется при создании объекта.
А невиртуальные — пожалуйста, их адрес известен на этапе компиляции.
Плохиш (2009-11-27 13:17:00) [3]
> Вопрос: КАК??? Ведь переменная nil.
Ну и что, в методе нет обращений к несуществующем переменным/полям.
Сделай поле в классе, вставь вывод его значения в своём методе и получишь своё желаемое исключение.