- •Внутреннее
- •Внутренний формат данных объекта имеет
- •Если объектн
- •Внутренний формат данных объекта.
- •TPerson
- •Таблица виртуальных методов.
- •Первое слово таблицы виртуальных методов содержит размер эк
- •Второе слово таблицы виртуальных методов содержит отрицател
- •Разрешение проверок границ диапазонов и проверок вызовов виртуальных методов замедляет выполнение программы и
- •Третье слово ТВМ содержит смещение сегмента данных объектно
- •Четвертое слово ТВМ резервируется и всегда равно 0.
- •Начиная со смещения 8,
- •Конструкторы объектных типов содержат специальный код, который запоминает смещение таблицы виртуальных
- •Для непосредственной работы с ТВМ используются две функции
- •Примененная к экземп
- •Функция TypeOf может использоваться для проверки фактического типа экземпляра.
- •Таблица динамических методов.
- •Таблица динамических методов.
- •Переопределим типы TStaf и
- •Первое слово
- •Таблица динамических методов.
- •Вызов статических методов.
- •Например:
- •Вызов статических методов.
- •Для вызова виртуального метода компилятор генерирует код, который:
- •Правила совместимости для объектных типов позволяют Staf указывать на TStaf и на ТТеасher
- •Вызов динамических методов.
- •Если бы метод GetSum типа TStaf описывался как
- •Вызов динамических методов.
- •Вызов динамических методов.
- •Вызов динамических методов.
- •Вызов конструкторов и деструкторов.
- •Вызов конструкторов и деструкторов.
- •Вызов конструкторов и деструкторов.
- •Вызов конструкторов и деструкторов.
Четвертое слово ТВМ резервируется и всегда равно 0.
Таблица виртуальных методов. |
11 |
Начиная со смещения 8,
Таблица виртуальных методов. |
12 |
TBM
одно слово памяти
два слова памяти
Пример размещения таблиц виртуальных методов типов TStaf и TTeacher13
Конструкторы объектных типов содержат специальный код, который запоминает смещение таблицы виртуальных
методов объектного типа в инициализируемых экземплярах.
Пусть у нас имеется |
экземпляр S типа TStaf и |
|
Например: |
• |
|
|
• |
экземпляр Т типа Ттеасher |
• |
вызов S.Init будет автоматически записывать смещение |
|
|
таблицы виртуальных методов типа TStaff в поле |
|
|
таблицы виртуальных методов экземпляра S |
|
• |
а вызов T.Init точно так же запишет смещение таблицы |
|
|
виртуальных методов типа ТТеасher в поле таблицы |
|
|
виртуальных методов экземпляра Т. |
Эта автоматическая инициализация является частью кода входа конструктора, поэтому если управление передается в начало операторной секции, то поле таблицы виртуальных методов параметра Self также будет установлено.
Таким образом, при необходимости конструктор может |
|
выполнить вызов виртуального метода. |
|
Таблица виртуальных методов. |
14 |
Для непосредственной работы с ТВМ используются две функции
FUNCTION SizeOf(Obj):WORD; |
FUNCTION TypeOf(Obj):POINTER; |
Функции для работы с таблицей виртуальных методов. |
15 |
Примененная к экземп
Функции для работы с таблицей виртуальных методов. |
16 |
Функция TypeOf может использоваться для проверки фактического типа экземпляра.
Например:
IF TypeOf(Self) = TypeOf(TPerson) THEN ...; |
Функции для работы с таблицей виртуальных методов. |
17 |
Таблица динамических методов. |
18 |
Таблица динамических методов. |
19 |
Переопределим типы TStaf и |
|
|
|
Ттеасher следующим образом: |
|
|
|
TStaff = OBJECT(TPerson); |
|
|
|
Bonus : REAL; |
|
|
|
CONSTRUCTOR Init(Nm,Dt :STRING; Rt,Bn :REAL); |
|
||
DESTRUCTOR Done; |
VIRTUAL; |
|
|
FUNCTION GetSum : REAL; |
VIRTUAL 10; |
|
|
PROCEDURE ShowSum; VIRTUAL 20; |
|
||
end;PROCEDURE ShowAll; |
VIRTUAL 30; |
|
|
TTeacher = OBJECT(TStaff) |
|
|
|
Hours : WORD; |
|
|
|
HourRate : REAL; |
|
|
|
CONSTRUCTOR Init(Nm,Dt :STRING; Rt,Bn,Hrt :REAL; Hr :WORD); |
|
||
DESTRUCTOR Done; |
VIRTUAL; |
|
|
FUNCTION GetSum:REAL; |
VIRTUAL 10; |
|
|
PROCEDURE ShowAll; |
VIRTUAL 30; |
|
|
END; |
|
|
|
Таблица динамических методов. |
20 |
TBM
одно слово памяти
два слова памяти
Схемы таблиц виртуальных и динамических методов для TStaf |
21 |
TBM
одно слово памяти
два слова памяти
Схемы таблиц виртуальных и динамических методов для ТТеаcher |
22 |