Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Внутрішнє представлення об’єктівСодержание книги
Поиск на нашем сайте
Внутрішній формат даних об’єкта нагадує внутрішній формат запису. Поля об’єкту записуються в порядку їх опису як неперервна послідовність змінних. Будь-яке поле, успадковане від батьківського типу, записується перед новими полями, визначеними в дочірньому типі. Якщо об’єктний тип визначає віртуальні методи, конструктори чи деструктори, то компілятор розміщає в ньому додаткове поле даних. Це 16-бітове поле, що називається полем таблиці віртуальних методів, використовується для запам’ятовування зміщення таблиці віртуальних методів в сегменті даних. Поле таблиці віртуальних методів розміщується безпосередньо після звичайних полів об’єктного типу. Якщо об’єктний тип успадковує віртуальні методи, конструктори чи деструктори, то він успадковує і поле VMT, завдяки чому додаткове поле таблиці віртуальних методів не розміщається. Ініціалізація поля таблиці віртуальних методів екземпляра об’єкта здійснюється конструктором (чи конструкторами) об’єктного типу. Програма ніколи не ініціалізує поле таблиці віртуальних методів явно і не має до нього доступу. Наступний приклад ілюструє представлення в сегменті даних об’єктів типів TStudent і TStudent1.
Таблиця віртуальних методів Кожен об’єктний тип, що містить чи успадковує віртуальні методи, конструктори або деструктори, має таблицю віртуальних методів, в яких запам’ятовується ініцалізована частина сегменту даних програми. Для кожного об’єктного типу (але не для кожного екземпляра) існує тільки одна таблиця віртуальних методів, однак два різні об’єктні типи ніколи не мають спільної таблиці віртуальних методів, незважаючи на те, наскільки вони ідентичні. Таблиці віртуальних методів створюються комп’ютером автоматично і програма ніколи не маніпулює ними безпосередньо. Вказівники на таблиці віртуальних методів теж запам’ятовуються автоматично в екземплярах об’єктних типів за допомогою конструкторів, програма ніколи не працює безпосередньо з цими вказівниками. Перше слово таблиці віртуальних методів містить розмір екземплярів відповідного об’єктного типу. Ця інформація використовується конструкторами і деструкторами для визначення кількості байтів, які виділяються чи вивільняються при використанні розширеного синтаксису стандартних процедур New і Dispose. Друге слово таблиці віртуальних методів містить від’ємний розмір екземплярів відповідного об’єктного типу. Ця інформація використовується програмою контролю викликів віртуальних методів для виявлення неініціалізованих об’єктів (екземплярів, для яких не був здійснений виклик конструктора) і для перевірки правильності таблиці віртуальних методів. Якщо дозволений контроль віртуального виклику за допомогою директиви {$R+}, то компілятор генерує виклик підпрограми контролю звертання до таблиці віртуальних методів перед кожним викликом віртуального метода. Ця підпрограма перевіряє нерівність першого слова VMT нулю і рівність суми першого і другого слів нулю. Якщо кожна з перевірок виявила неспівпадіння, то генерується помилка виконання з кодом 210. Дозвіл перевірок границь діапазонів і перевірок викликів віртуальних методів сповільнює виконання програми і робить розмір EXE-файлів дещо більшим, тому рекомендується використовувати директиву {$R+} тільки під час налагодження і переключати цю директиву в {$R-} у остаточній версії програми. Третє слово VMT містить зміщення сегменту даних об’єктного типу в таблиці динамічних методів (DMT) чи 0, якщо об’єкт не містить динамічних методів. Четверте слово VMT резервується і завжди рівне 0. Нарешті, починаючи зі зміщення 8 таблиці віртуальних методів, йде список 32-розрядних вказівників методів (однин вказівник на кожен віртуальний метод в порядку їх опису). Кожна позиція містить адресу точки входу відповідного віртуального метода. Наступний приклад демонструє розміщення таблиць віртуальних методів типів TStudent і TStudent1. Кожен маленький прямокутник відповідає одному слову пам’яті, а кожен більший – двом словам пам’яті. Зверніть увагу на те, як TStudent1 успадковує поліморфний метод ShowName. Як вже згадувалося, конструктори об’єктних типів містять спеціальний код, що запам’ятовує зміщення таблиці віртуальних методів об’єктного типу та ініціалізованих екземплярів. Наприклад, якщо маємо екземпляр S типу TStudent і екземпляр T типу TStudent1, то виклик S.Init буде автоматично записувати зміщення таблиці віртуальних методів типу TStudent в поле таблиці віртуальних методів екземпляра S, а виклик T.Init – запише зміщення VMT типу TStudent1 в поле VMT екземпляра Т. Ця автоматична ініціалізація є частиною коду входу конструктора, тому, якщо управління передається в початок операторної секції, то поле таблиці віртуальних методів параметра Self теж буде установлено. Таким чином, при необхідності конструктор може виконувати виклик віртуального методу.
|
||||
Последнее изменение этой страницы: 2021-12-15; просмотров: 43; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.188.114.150 (0.007 с.) |