Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

подскажите чем виртуальная функция отличается от обычной функции

Олюшка Профи (615), закрыт 10 лет назад
Лучший ответ
Нуриев Нусрат Мастер (1597) 15 лет назад
Виртуальные и динамические методы не связаны с другими методами с тем
же именем в классах — наследниках. Если в классах — наследниках эти методы
перегружены, то при обращении к такому методу во время выполнения будет вы-
зываться тот из методов с одинаковыми именами, который соответствует классу
объекта, указанному при вызове. Например, если имеется базовый класс графиче
ских объектов TShape и ряд наследующих ему классов различных геометрических
фигур, и если в каждом из этих классов определен свой виртуальный метод Draw,
рисующий эту фигуру, то можно написать в программе:
var ShapeSrray: array[1..10] of TShape;
for i:=l to 10 do ShapeArray.Draw;
В этом коде в массив ShapeArray могут помещаться объекты разных классов,
наследующих TShape. В цикле for обращение к объектам производится как к объ-
ектам базового для них типа TShape. В этом случае для каждого объекта будет вы-
зываться виртуальный метод Draw именно этого объекта. Такой подход, облегчаю-
щий работу с множеством родственных объектов, называется полиморфизмом.
При объявлении в классе виртуальных и динамических методов после точки
с запятой, завершающей объявление метода, добавляются ключевые слова virtual
или dynamic. Например:
type
TShape = class
procedure Draw; virtual ;
end;
....

А вот ещё , если непонятно:
http://ru.wikipedia.org/wiki/Виртуальный_метод
Источник: Архангельский - программирование в Delphi
Остальные ответы
Denis Мастер (1632) 15 лет назад
наверное тем что виртуальная принадлежит классу а простая и без класса может быть (хотя я точно не помню)
fekla deineka Гуру (3331) 15 лет назад
Если под "обычной функцией" имеется в виду функция-член класса, то различие в следующем:
- виртуальная функция может быть переопределена в классе-наследнике, при вызове функции объектом этого класса-наследника будет вызвана именно эта переопределенная функция (если она не переопределена, то вызывается функция базового класса)
- функция, не объявленная как виртуальная, не может быть переопределена в классе-наследнике. Даже если ее там переопределить, при вызове все равно будет вызываться функция базового класса.
Похожие вопросы