Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Знатокам ООП...


Labert ©   (2004-08-18 12:40:00) 

Предположим, есть такие объявления:

TA = class
procedure PP; virtual;
end;

TB = class(TA)
procedure PP;
end;

Обращаю ваше внимание, что я намеренно опустил слово OVERRIDE в заголовке метода TB.PP
Т.е. в этом случае, как написано в документации
"...the new declaration merely hides the inherited one without overriding it..."

при этом:

var
a : TA;
begin
a := TB.create;
a.PP;   //вызывается TA.PP

Внимание вопрос:
Будет ли в VMT класса TB строка для метода PP?
Если да, то она указывает на TA.PP?


Юрий Зотов   (2004-08-18 13:29:00) [1]

> Labert

Еще раз: TB.PP - метод статический. Откуда в таблице виртуальныхметодов (VMT) возьмется ссылка на статическийметод? К тому же этот метод - public, то есть он не войдет и в DMT.

> Какой код Delphi скомпилирует для вызова a.PP
Вы же сами написали - код вызова виртуального метода TA.PP

> А где я посмотрю?
В окне CPU, естественно, где ж еще? Ставьте BreakPoint, жмите Ctrl+Alt+C и смотрите на здоровье.

> Сами-то не знаете?
Вы считаете, что кто-нибудь станет заучивать наизусть, какие конкретно коды генерит компилятор, если их всегда можно посмотреть в окне CPU?

==============================

Причина всего этого очень проста - пропуск override разрывает цепочку наследования метода. О чем и сообщает компилятор.


Digitman   (2004-08-18 13:27:00) [2]


> Labert ©   (18.08.04 13:15) [5]


> где я посмотрю?
> Сами-то не знаете?


дурочку только не гони !
у тебя перед носом меню View -> Debug Windows.. -> CPU

ставь брейкпойнт на строке с вызовом метода a.PP , стартуй приложение , лови брейкпойнт, открывай  CPU-окно и изучай сабж !


Labert   (2004-08-18 13:25:00) [3]

Ладно, повторюсь:

Будет ли в VMT класса TB строка для метода PP?
Какой код Delphi скомпилирует для вызова a.PP ?

Если кто знает, то помогите мне, убогому, пожалуйста.

Если не знаете, то просьба ничего не писать


jack128   (2004-08-18 13:20:00) [4]


> А где я посмотрю?
Alt+Ctrl+C

> Сами-то не знаете?
Хе. Попытка развести Digitman'a на "слабо"?  Ну - ну..


DK   (2004-08-18 13:19:00) [5]

С этими дериктивами и компелятору спокойнее
"...the new declaration merely hides the inherited one without overriding it..." и новый метод, а не TA.PP будет в VMT!


Labert   (2004-08-18 13:15:00) [6]

>DK ©   (18.08.04 13:05) [4]
причем тут overload вообще?

>Digitman ©   (18.08.04 12:59) [3]
А где я посмотрю?
Сами-то не знаете?


DK   (2004-08-18 13:05:00) [7]

попробуй reintroduce; overload;


Digitman   (2004-08-18 12:59:00) [8]


> Labert ©   (18.08.04 12:53) [2]


самому-то посмотреть - не судьба ?


Labert   (2004-08-18 12:53:00) [9]

Похоже, никто не знает...

>Digitman
Ну ладно, тогда такой вопрос:

Какой код Delphi скомпилирует для вызова a.PP ?


Digitman   (2004-08-18 12:42:00) [10]


> Будет ли в VMT класса TB строка для метода PP?


откуда она там возьмется ? если TB.PP - статический метод ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо