VIRTUAL — определение виртуальных методов

Переведен стандартный раздел помощи для ключевого слова «VIRTUAL». Рекомендуется к прочтению.
Атрибут VIRTUAL — это атрибут, используемый при описании прототипа метода класса. Определяет, что процедура будет являться виртуальным методом класса.
Это позволяет методам РОДИТЕЛЬСКОГО класса вызывать методы ДОЧЕРНЕГО класса. Атрибут VIRTUAL должен быть объявлен
в обоих прототипах методов: и в родительском и в дочернем классе.
Пример:

OneClass   CLASS                           ! БАЗОВЫЙ класс
BaseProc      PROCEDURE(REAL Parm)         ! не виртуальный метод
Proc          PROCEDURE(REAL Parm),VIRTUAL ! определение виртуального метода
           END

TwoClass   CLASS(OneClass)                 ! ДОЧЕРНИЙ класс от базового класса OneClass
Proc          PROCEDURE(REAL Parm),VIRTUAL ! определение виртуального метода
           END

ClassThree OneClass                        ! еще один экземпляр БАЗОВОГО класса OneClass
ClassFour  TwoClass                        ! еще один экземпляр класса TwoClass

 CODE
 OneClass.BaseProc(1)       ! процедура BaseProc вызывает процедуру OneClass.Proc
 TwoClass.BaseProc(2)       ! процедура BaseProc вызывает процедуру TwoClass.Proc
 ClassThree.BaseProc(3)     ! процедура BaseProc вызывает процедуру OneClass.Proc
 ClassFour.BaseProc(4)      ! процедура BaseProc вызывает процедуру TwoClass.Proc

OneClass.BaseProc  PROCEDURE(REAL Parm)
 CODE
 SELF.Proc(Parm)            ! вызов виртуального метода, вызывается или OneClass.Proc
                            ! или TwoClass.Proc, это зависит от того из какого экземпляра
                            ! класса вызывается BaseProc

OneClass.Proc PROCEDURE(Real Parm)
 CODE
 message('OneClass',Parm)

TwoClass.Proc PROCEDURE(Real Parm)
 CODE
 message('TwoClass',Parm)

Комментарии
Несмотря на небольшой объем, пример достаточно хорошо показывает использование полиморфизма. Обратите внимание, что строка TwoClass.BaseProc(2) выполняет метод, который не описан в классе TwoClass, его там нет, он наследуется от класса OneClass. Задача метода BaseProc — вызвать метод Proc.
И вызывается метод класса TwoClass. Это и есть способность наследуемого РОДИТЕЛЬСКОГО метода вызывать методы ДОЧЕРНЕГО класса.