Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Free Pascal, Pascal ABC и другие _ Переопределение виртуальных методов

Автор: Bokul 24.12.2006 4:43

Несколько часов искал ошибку, которую FreePascal вроде должен бы отлавливать:
Наследник в переопределении виртуального метода предка делает его статическим. Должен ли компилятор сообщить об этом? Ведь в Паскале вроде нельзя так делать?

Автор: volvo 24.12.2006 4:48

Код в студию...

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

Автор: Bokul 24.12.2006 4:53

Да все теже шарики:


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 24.12.2006 5:09

А что,

Цитата(Compiler Messages)
...
Ball.pas(11,19) Warning: An inherited method is hidden by "TBall.ChangeDirection(Byte, Double)"
...
уже недостаточно? Или на Warning-и не обращаем внимания? smile.gif

Автор: Bokul 24.12.2006 5:31

Цитата
Или на Warning-и не обращаем внимания?

Обращал бы если знал как их включить... Как?

Автор: volvo 24.12.2006 5:37

По умолчанию все включено... Только при успешной (без Errors) компиляции окно Compiler Message становится Hidden, его надо опять показать... Alt+0 (ноль) Выбираешь CompilerMessages -> Show, и смотришь внимательно на все, что касается Warning и Hints...

Автор: Bokul 24.12.2006 5:46

Не выходит, смотри: Прикрепленное изображение

Автор: volvo 24.12.2006 6:04

По-моему, Messages и CompilerMessages - не одно и то же... Проверь, есть ли в Window -> List именно CompilerMessages... Заодно еще и в Options -> Compiler -> Verbose посмотри, включено ли Warnings/Hints/Notes ...

Автор: Bokul 24.12.2006 6:28

Ухты, спасибо good.gif . Полезная штука yes2.gif

Цитата
Ball.pas(11,19) Warning: An inherited method is hidden by "TBall.ChangeDirection(Byte, Double)"

А как это можно понимать?

Автор: volvo 24.12.2006 6:35

А вот так и понимать - метод предка скрыт методом TBall.ChangeDirection... А раз скрыт - то у тебя сразу должен возникнуть вопрос: а я просил скрывать? Нет, не просил... Значит, что-то не то... Или Override (с классами) или Virtual не поставил... smile.gif

Автор: Bokul 24.12.2006 6:39

Спасибо! smile.gif
А можно сделать так, чтобы это окно не исчезало?

Автор: volvo 24.12.2006 6:43

Вообще-то я сейчас прочитал в User.pdf, что по нажатию F12 появляется окно с сообщениями последней компиляции... Есть смысл его держать всегда на экране? no1.gif

Автор: furosemide 40 mg without perscri 15.09.2021 18:03

Liquid Cialis For Sale