![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Знатокам ООП...
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 - статический метод ?