Помощь - Поиск - Пользователи - Календарь
Полная версия: Переопределение виртуальных методов
Форум «Всё о Паскале» > Pascal, Object Pascal > 32 битные компиляторы
Bokul
Несколько часов искал ошибку, которую FreePascal вроде должен бы отлавливать:
Наследник в переопределении виртуального метода предка делает его статическим. Должен ли компилятор сообщить об этом? Ведь в Паскале вроде нельзя так делать?
volvo
Код в студию...

(хотя бы описания классов, в которых определяется виртуальный метод, и где он замещается статическим blink.gif )
Bokul
Да все теже шарики:

type
TPGObject=^TGObject;
TGObject=object
v,col:byte; //speed, color
l,t:real;//angle, time
constructor init(speed,color:byte; angle,time:real);
procedure moveto;
procedure ChangeDirection; virtual;//abstract; //!!!!!!!!!!!!!!!!!!
procedure calculation; virtual; //abstract;
function GetFrontPoint:TPoint; virtual;//abstract;
function IsInside(P:TPoint):boolean; virtual;//abstract;
procedure show; virtual;// abstract;
procedure hide; virtual;// abstract;
destructor done; virtual;
end;




type
TPBall=^TBall;
TBall=object(TGObject)
public
pos:TPoint;
//pos.x,pos_y:integer;
radius:integer;//radius
constructor init(x,y:integer; speed,color:byte; angle,time:real; r:byte);
procedure ChangeDirection; //!!!!!!!!!!!!!!!!!!
procedure calculation; virtual;
function GetFrontPoint:TPoint; virtual;
function IsInside(P:TPoint):boolean; virtual;
procedure show; virtual;
procedure hide; virtual;
destructor done; virtual;
private
function distance(P:TPoint):real;
end;


Метод ChangeDirection.
Совместимость в обоих модулях стоит с TP - через директиву {$Mode Tp}
volvo
А что,
Цитата(Compiler Messages)
...
Ball.pas(11,19) Warning: An inherited method is hidden by "TBall.ChangeDirection(Byte, Double)"
...
уже недостаточно? Или на Warning-и не обращаем внимания? smile.gif
Bokul
Цитата
Или на Warning-и не обращаем внимания?

Обращал бы если знал как их включить... Как?
volvo
По умолчанию все включено... Только при успешной (без Errors) компиляции окно Compiler Message становится Hidden, его надо опять показать... Alt+0 (ноль) Выбираешь CompilerMessages -> Show, и смотришь внимательно на все, что касается Warning и Hints...
Bokul
Не выходит, смотри: Нажмите для просмотра прикрепленного файла
volvo
По-моему, Messages и CompilerMessages - не одно и то же... Проверь, есть ли в Window -> List именно CompilerMessages... Заодно еще и в Options -> Compiler -> Verbose посмотри, включено ли Warnings/Hints/Notes ...
Bokul
Ухты, спасибо good.gif . Полезная штука yes2.gif
Цитата
Ball.pas(11,19) Warning: An inherited method is hidden by "TBall.ChangeDirection(Byte, Double)"

А как это можно понимать?
volvo
А вот так и понимать - метод предка скрыт методом TBall.ChangeDirection... А раз скрыт - то у тебя сразу должен возникнуть вопрос: а я просил скрывать? Нет, не просил... Значит, что-то не то... Или Override (с классами) или Virtual не поставил... smile.gif
Bokul
Спасибо! smile.gif
А можно сделать так, чтобы это окно не исчезало?
volvo
Вообще-то я сейчас прочитал в User.pdf, что по нажатию F12 появляется окно с сообщениями последней компиляции... Есть смысл его держать всегда на экране? no1.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.