русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Таблиця віртуальних методів


Дата додавання: 2014-04-22; переглядів: 1241.


Кожен об’єктний тип, що містить чи успадковує віртуальні методи, конструктори або деструктори, має таблицю віртуальних методів, в яких запам’ятовується ініцалізована частина сегменту даних програми. Для кожного об’єктного типу (але не для кожного екземпляра) існує тільки одна таблиця віртуальних методів, однак два різні об’єктні типи ніколи не мають спільної таблиці віртуальних методів, незважаючи на те, наскільки вони ідентичні. Таблиці віртуальних методів створюються комп’ютером автоматично і програма ніколи не маніпулює ними безпосередньо. Вказівники на таблиці віртуальних методів теж запам’ятовуються автоматично в екземплярах об’єктних типів за допомогою конструкторів, програма ніколи не працює безпосередньо з цими вказівниками.

Перше слово таблиці віртуальних методів містить розмір екземплярів відповідного об’єктного типу. Ця інформація використовується конструкторами і деструкторами для визначення кількості байтів, які виділяються чи вивільняються при використанні розширеного синтаксису стандартних процедур 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 теж буде установлено. Таким чином, при необхідності конструктор може виконувати виклик віртуального методу.

 


<== попередня лекція | наступна лекція ==>
Внутрішнє представлення об’єктів | Функції роботи з таблицею віртуальних методів


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн