Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.05;
Скачать: CL | DM;

Вниз

Знатокам ООП...   Найти похожие ветки 

 
Labert ©   (2004-08-18 12:40) [0]

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

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?


 
Digitman ©   (2004-08-18 12:42) [1]


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


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


 
Labert ©   (2004-08-18 12:53) [2]

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

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

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


 
Digitman ©   (2004-08-18 12:59) [3]


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


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


 
DK ©   (2004-08-18 13:05) [4]

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


 
Labert ©   (2004-08-18 13:15) [5]

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

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


 
DK ©   (2004-08-18 13:19) [6]

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


 
jack128 ©   (2004-08-18 13:20) [7]


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

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


 
Labert ©   (2004-08-18 13:25) [8]

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

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

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

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


 
Digitman ©   (2004-08-18 13:27) [9]


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


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


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

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


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

> Labert

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

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

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

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

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

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



Страницы: 1 вся ветка

Текущий архив: 2004.09.05;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.095 c
14-1092309182
QuestionX
2004-08-12 15:13
2004.09.05
Трояны. Как бороться ?


1-1092936808
3APA3A
2004-08-19 21:33
2004.09.05
Правильное использование Dispose()...


3-1091906797
Денисыч
2004-08-07 23:26
2004.09.05
Поддерживает ли технология dbexpress Firebird ?


1-1092736455
FastByte
2004-08-17 13:54
2004.09.05
Унарный минус в ОПЗ


3-1091870899
Grushin
2004-08-07 13:28
2004.09.05
Пароль администратора в Oracle