Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Почему не роботает виртуальная функция ?

276
27 ноября 2007 года
Rebbit
1.1K / / 01.08.2005
Надо было показать человеку что такое виртуальная функция.
Роботаем на РНР и Джаве, а там они такие по дефолту. Взял старый добрый Турбо Паскаль и написал следующий код
Код:
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 без сервиспаков).

Не подскажите в чем проблема ? А то я стою тут как в ...... опущеный и не могу виртуальную процедуру забабахать. Пришлось на Джаве показывать. :(
257
27 ноября 2007 года
kosfiz
1.6K / / 18.09.2005
у тебя ошибка доступа. конструкторы надо добавить к объектам, а потом так:
 
Код:
r.Create; //ну или как ты конструктор назовешь
//после чего используешь
286
28 ноября 2007 года
misha_turist
572 / / 28.11.2005
А разве ключевое слово override при перекрытии вируального метода добавлять не надо к его имени? (хотя мож я ошибаюсь....)
И не хочеш GObject.Draw сделать абстрактным.
276
28 ноября 2007 года
Rebbit
1.1K / / 01.08.2005
Цитата: misha_turist
А разве ключевое слово override при перекрытии вируального метода добавлять не надо к его имени? (хотя мож я ошибаюсь....)
И не хочеш 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.

Зароботало. Но пришлось переменные указателями делать. Что впринцыпе и понятно.
Ужас, как все забывается. А ведь когдато мне и среды не нодо было. Мог програмку на бумажке писать и опции компилятора Ручками проставлять.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог