type
GObject = object
x, y: integer;
procedure Draw; virtual;
end;
GCircle = object(GObject)
procedure Draw; virtual;
end;
GRectangle = object(GObject)
procedure Draw; virtual;
end;
procedure GObject.Draw;
begin
writeln('Uncnown object');
end;
procedure GRectangle.Draw;
begin
writeln('Rectangle X=',x,' Y=',y);
end;
procedure GCircle.Draw;
begin
writeln('Circle X=',x,' Y=',y);
end;
VAR
r: GRectangle;
c: GCircle;
o: GObject;
BEGIN
r.x := 2;
r.y := 3;
r.Draw;
o := r;
o.Draw;
END.
Почему не роботает виртуальная функция ?
Роботаем на РНР и Джаве, а там они такие по дефолту. Взял старый добрый Турбо Паскаль и написал следующий код
Код:
Компилится на ура, но при выполнении молча вылетает. У меня 2 мысли.
1. Я напрочь забыл Паскаль и не так код написал
2. Досовский ТП не хочет так роботать под виндой (Windows XP prof без сервиспаков).
Не подскажите в чем проблема ? А то я стою тут как в ...... опущеный и не могу виртуальную процедуру забабахать. Пришлось на Джаве показывать. :(
Код:
r.Create; //ну или как ты конструктор назовешь
//после чего используешь
//после чего используешь
И не хочеш GObject.Draw сделать абстрактным.
Цитата: misha_turist
А разве ключевое слово override при перекрытии вируального метода добавлять не надо к его имени? (хотя мож я ошибаюсь....)
И не хочеш GObject.Draw сделать абстрактным.
И не хочеш GObject.Draw сделать абстрактным.
Ето помойму уже потом мой старенький компилятор вообще таких словей не знает. А на счет абстрактного - Я хотел показать разницу между виртуальным методом и простым, так что абстрактный ето было бы уже потом :).
Сделал так как сказал kosfiz.
Код:
type
GObject = object
x, y: integer;
Constructor Create;
procedure Draw;
end;
GCircle = object(GObject)
procedure Draw;
end;
GRectangle = object(GObject)
procedure Draw;
end;
Constructor GObject.Create;
begin
x := 0; y := 0;;
end;
procedure GObject.Draw;
begin
writeln('Uncnown object');
end;
procedure GRectangle.Draw;
begin
writeln('Rectangle X=',x,' Y=',y);
end;
procedure GCircle.Draw;
begin
writeln('Circle X=',x,' Y=',y);
end;
VAR
r: ^GRectangle;
c: ^GCircle;
o: ^GObject;
BEGIN
new (r, Create);
r^.x := 2;
r^.y := 3;
r^.Draw;
o := r;
o^.Draw;
END.
GObject = object
x, y: integer;
Constructor Create;
procedure Draw;
end;
GCircle = object(GObject)
procedure Draw;
end;
GRectangle = object(GObject)
procedure Draw;
end;
Constructor GObject.Create;
begin
x := 0; y := 0;;
end;
procedure GObject.Draw;
begin
writeln('Uncnown object');
end;
procedure GRectangle.Draw;
begin
writeln('Rectangle X=',x,' Y=',y);
end;
procedure GCircle.Draw;
begin
writeln('Circle X=',x,' Y=',y);
end;
VAR
r: ^GRectangle;
c: ^GCircle;
o: ^GObject;
BEGIN
new (r, Create);
r^.x := 2;
r^.y := 3;
r^.Draw;
o := r;
o^.Draw;
END.
Зароботало. Но пришлось переменные указателями делать. Что впринцыпе и понятно.
Ужас, как все забывается. А ведь когдато мне и среды не нодо было. Мог програмку на бумажке писать и опции компилятора Ручками проставлять.