TURBO PASCAL

Новости

Программы   

Turbo Pascal 

Игры

Документация   

Странности

FAQ

Ссылки

Форум

Гостевая книга

Рассылка

Благодарности

Об авторе

 

 

Объектные типы 

             Внутренний формат данных объекта имеет сходство с внутренним
        форматом записи.  Поля объекта записываются в порядке их описаний
        как непрерывная последовательность переменных.  Любое поле, унас-
        ледованное от родительского (порождающего) типа, записывается пе-
        ред новыми полями, определенными в дочернем (порожденном) типе.

             Если объектный тип определяет виртуальные методы,  конструк-
        тор или деструктор,  то компилятор размещает в объектном типе до-
        полнительное поле данных.  Это 16-битовое поле,  называемое полем
        таблицы виртуальных методов (VMP),  используется для  запоминания
        смещения таблицы виртуальных методов в сегменте данных. Поле таб-
        лицы виртуальных методов следует  непосредственно  после  обычных
        полей  объектного типа.  Если объектный тип наследует виртуальные
        методы, конструкторы или деструкторы  (сборщики  мусора),  то  он
        также наследует и поле таблицы виртуальных методов, благодаря че-
        му дополнительное поле таблицы виртуальных методов не выделяется.

             Инициализация поля таблицы  виртуальных  методов  экземпляра
        объекта осуществляется конструктором (или конструкторами) объект-
        ного типа.  Программа никогда не инициализирует поле таблицы вир-
        туальных методов явно и не имеет к нему доступа.

             Следующие примеры  иллюстрируют  внутренние  форматы  данных
        объектных типов.

             type
               PLocation = ^TLocation;
               TLocation = object
               X,Y: integer;
               procedure Init(PX, PY: Integer);
               function GetX: Integer;
               function GetY: Integer;
             end;

             PPoint = ^TPoint;

             TPoint = object(TLocation)
               Color: Integer;
               constructor Init(PX, PY, PColor: Integer);
               destructor Done; virtual;
               procedure Show; virtual;
               procedure Hide; virtual;
               procedure MoveTo(PX, PY: I+nteger); virtual;
             end;

             PCircle = ^TCircle;
             TCircle = object(TPoint)
               Radius: Integer;
               constructor Init(PX, PY, PColor, PRadius: Integer);
               procedure Show; virtual;

         B.Pascal 7 & Objects/LR     - 378 -

               procedure Hide; virtual;
               procedure Fill; virtual;
             end;

             Рисунок 21.8   показывает   размещение   экземпляров   типов
        TLocation, TPoint и TCircle:  каждый прямоугольник  соответствует
        одному слову памяти.

                   TLocation          TPoint           TCircle
                 ┌──────────┐     ┌───────────┐     ┌───────────┐
                 │ X        │     │ X         │     │ X         │
                 ├──────────┤     ├───────────┤     ├───────────┤
                 │ Y        │     │ Y         │     │ Y         │
                 └──────────┘     ├───────────┤     ├───────────┤
                                  │ Color     │     │ Color     │
                                  ├───────────┤     ├───────────┤
                                  │ VMT       │     │ VMT       │
                                  └───────────┘     ├───────────┤
                                                    │ Radius    │
                                                    └───────────┘

             Рис. 21.8  Схема  экземпляров  типов  TLocation,  TPoint   и
        TCircle.

             Так как  TPoint  является  первым типом в иерархии,  который
        вводит виртуальные методы,  то поле таблицы  виртуальных  методов
        размещается сразу после поля Color.

Содержание

На первую страницу

Rambler's Top100 Rambler's Top100
PROext: Top 1000

(с)Все права защищены

По всем интересующим вопросам прошу писать на электронный адрес

Hosted by uCoz