Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2008, 21:07   #1
Иллидан
Форумчанин
 
Регистрация: 16.01.2008
Сообщений: 288
По умолчанию Виртуальный функции.

Объясните пожалуйсто, кто при думал виртуальные функции и для чего они нужны. Литературы много, но там как-то сложно написанно: толи они нужны предкам, толи потомкам; создается какае-то таблица виртуальных методво. И какой-нибудь маленький и понятный пример: что не будет работать без виртуальных функций и как это исправить с их помощью (на Паскале).
Заранее спасибо.
Иллидан вне форума Ответить с цитированием
Старый 10.04.2008, 21:13   #2
Карась
Участник клуба
 
Аватар для Карась
 
Регистрация: 26.10.2007
Сообщений: 1,244
По умолчанию

В интернету много есть статей толковых по этому поводу...
Вроде понятно написанно здесь: http://club.shelek.com/viewart.php?id=239
Умом Россию не понять, пока не выпито ноль пять,
А если выпито ноль пять всё делом кажется не хитрым,
Попытка глубже понимать уже попахивает литром...
Карась вне форума Ответить с цитированием
Старый 10.04.2008, 22:02   #3
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Рисование разнородных объектов одного базового класса в цикле. Сравни с комментариями и без. Во втором случае вызов функции осуществляется на основе фактического типа объекта.
Код:
program Project2;

{$APPTYPE CONSOLE}

type
  TShape = class
  public
    procedure Draw; //virtual;
  end;

  TLine = class(TShape)
  public
    procedure Draw; //override;
  end;

  TCircle = class(TShape)
  public
    procedure Draw; //override;
  end;

procedure TShape.Draw;
begin
  WriteLn('TShape.Draw');
end;

procedure TLine.Draw;
begin
  WriteLn('TLine.Draw');
end;

procedure TCircle.Draw;
begin
  WriteLn('TCircle.Draw');
end;

const
  N = 2;

var
  A: array [1..N] of TShape;
  I: Integer;

begin
  A[1] := TLine.Create;
  A[2] := TCircle.Create;

  for I := 1 to N do
    A[i].Draw;

  ReadLn;
end.
still_alive вне форума Ответить с цитированием
Старый 11.04.2008, 10:28   #4
Ins
Форумчанин
 
Регистрация: 29.12.2007
Сообщений: 137
По умолчанию

Виртуальные методы позволяют реализовать полиморфизм - т.е. разное поведение при одном и том же коде. Благодаря им у нас есть возможность написать некий обобщенный код, который вызывает виртуальные функции, но его конкретное поведение зависит от того, для каких именно классов он выполняется. Пример:
в Delphi есть такой класс - TStream, который представляет собой некое абстрактное хранилище данных. У класса есть методы - Read и Write, которые позволяют соответственно читать и писать данные в это хранилище. Эти методы виртуальные и конкретное их поведение определяется потомками. Так у потомка TFileStream эти методы перекрыты так, что читают и пишут в файл, у TMemoryStream - в память и т.д. Но мы можем не знать какой у нас конкретно потомок TStream, а написать полиморфный код, вроде такого:
procedure SaveToStream(Stream: TStream);
Код:
begin
  Stream.Write(...); {записываем какие-либо данные}
  Stream.Write(...); {записываем какие-либо данные}
  ...
end;
Который будет записывать данные в хранилище (файл, память или еще что-то) в зависимости от того, к какому классу реально относится параметр Stream. А передавать в качестве этого параметра мы можем любой потомок TStream со своей реализацией методов Read и Write.
Ins вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Виртуальный порт Dj_smart Win Api 0 13.07.2008 19:19
']'-виртуальный код Var17 Общие вопросы Delphi 2 02.04.2008 14:11
виртуальный процессор darkstoun Помощь студентам 3 23.11.2007 21:12