Лабораторна робота № 8
Тема: Спадкування з пізнім зв’язуванням
Мета: Розглянути спадкування з пізнім зв’язуванням
Теоретичні відомості:
У разі перевизначати функції компілятор вміє відрізняти один виклик від одного за типом їх аргументів. Використовуючи цю інформацію, він "жорстко" пов'язує коди програми з відповідними функціями елементами. З іншого боку, буває необхідно відрізнити один виклик від іншого, за наявності аргументів одного типу на етапі виконання, і забезпечити нащадки класу різними версіями функцій базового класу. Саме використання ключового слова virtual призводить до відстрочення зв'язування, і виклику потрібної функції на етапі виконання. Віртуальна функція елемент - це функція, яка будучи описана в нащадках, заміщає собою відповідну функцію елемент скрізь - навіть у предка, якщо вона викликається для нащадка. На відміну від раннього зв'язування з використанням перевизначають функцій елементів, віртуальні функції елементи повинні мати аргументи одного типу. Синтаксис визначення віртуальних функцій елементів дуже прозорий: додайте слово virtual до першого визначення функції елементу:   virtual void Show ();   virtual void Hide (); Увага! Тільки вбудовані функції елементи можуть бути оголошені як віртуальні. Як тільки функція оголошена віртуальною, вона не може бути перевизначено ні в якому успадковане класі з однотипним переліком аргументів, але з іншим типом значення, що повертається. Якщо ви перевизначають Show з тим же переліком однотипних аргументів і таким же типом значення, що повертається, то нова функція Show автоматично стає віртуальним, незалежно від того, використовується ключове слово virtual чи ні. У цьому випадку говорять, що нова віртуальна Show заміщає Show у своєму базовому класі. Ви можете вільно перевизначати Show з іншим переліком різнотипних аргументів (змінюючи при цьому тип значення, що повертається чи ні), але віртуальний механізм не задіюється для такої версії Show. Яка саме функція елемент Show буде викликана - залежить тільки від класу об'єкта, для якого викликається Show, навіть якщо дзвінок здійснюється через вказівник на базовий клас. Наприклад,   Circle ACircle   Point * APoint_рointer = &ACircle; / / покажчик на Circle,       / / Якому присвоюється       / / Значення вказівника на       / / Базовий клас, Point   APoint_рointer-> Show (); / / викликає Circle:: Show! Так як виклик невіртуальному функції-елемента виконується трохи швидше, ніж віртуального, то в загальному випадку рекомендується, коли не постає питання про розширюваності, але суттєве значення має продуктивність, користуватися звичайними функціями елементами. В іншому випадку, потрібно користуватися віртуальними.
Хід роботи
Реалізувати спадкування с пізнім зв’язуванням структури:
«Спорт клубу».
«Бібліотеки».
«Обувного магазину»
«Булочної»
«Мобільного магазину»
Тощо…