Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Механізм пізнього зв'язування

Для кожного класу (не об'єкта!), що містить хоча б один віртуальний метод, компілятор створює таблицю віртуальних методів (vtbl), у якій для кожного віртуального методу записана його адреса в пам'яті. Адреси методів утримуються в таблиці в порядку їхнього опису в класах. Адреса будь-якого віртуального методу має в vtbl одне й теж зміщення для кожного класу в межах ієрархії.

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

На етапі компіляції посилання на віртуальні методи заміняються на звертання до vtbl через vptr об'єкта, а на етапі виконання в момент звертання до методу його адреса вибирається з таблиці. Таким чином, виклик віртуального методу, на відміну від звичайних методів і функцій, виконується через додатковий етап одержання адреси методу із таблиці. Це трохи сповільнює виконання програми.

Рекомендується робити віртуальними деструктори для того, щоб гарантувати правильне звільнення пам'яті з-під динамічного об'єкта, оскільки в цьому випадку в будь-який момент часу буде обраний деструктор, що відповідає фактичному типові об'єкта. Деструктор передає операції delete розмір об'єкта, що має тип size_t. Якщо об'єкт, що видаляється, є похідним і в ньому не визначений віртуальний деструктор, переданий розмір об'єкта може виявитися неправильним.

Чіткого правила, по якому метод варто робити віртуальним, не існує. Можна тільки дати рекомендацію повідомляти віртуальними методи, для яких є імовірність, що вони будуть перевизначені в похідних класах. З іншого боку, при проектуванні ієрархії не завжди можна пророчити, яким образом будуть розширюватися базові класи (особливо при проектуванні бібліотек класів), а оголошення методу віртуальним забезпечує гнучкість і можливість розширення.

Для пояснення останньої тези уявимо собі, що виклик методу draw здійснюється з методу переміщення об'єкта. Якщо текст методу переміщення не залежить від типу переміщуваного об'єкта (оскільки принцип переміщення всіх об'єктів однаковий, а для "отрисовки" викликається конкретний метод), перевизначати цей метод у похідних класах немає необхідності, і він може бути описаний як невіртуальний. Якщо метод draw віртуальний, метод переміщення зможе без перекомпіляції працювати з об'єктами будь-яких похідних класів - навіть тих, про які при його написанні нічого відомо не було.

Віртуальний механізм працює тільки при використанні покажчиків або посилань на об'єкти. Об'єкт, визначений через покажчик або посилання й утримуючий віртуальний методи, називається поліморфним. У даному випадку поліморфізм полягає в тому, що за допомогою того самого звертання до методу виконуються різні дії в залежності від типу, на який посилається покажчик у кожен момент часу.


Дата добавления: 2015-07-20; просмотров: 67 | Нарушение авторских прав


Читайте в этой же книге: Визначені макроси. | КОНТРОЛЬНІ ПИТАННЯ | Особливості типу char | Рекомендації зо вибору імен змінних і функцій | ТЕОРЕТИЧНА ЧАСТИНА | Функції для роботи з рядками | Робота з файлами | Запам'ятайте! | Ключі доступу | Просте спадкування |
<== предыдущая страница | следующая страница ==>
Віртуальні методи| Варіант 4-24.

mybiblioteka.su - 2015-2024 год. (0.007 сек.)