Лабораторна робота № 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! Так як виклик невіртуальному функції-елемента виконується трохи швидше, ніж віртуального, то в загальному випадку рекомендується, коли не постає питання про розширюваності, але суттєве значення має продуктивність, користуватися звичайними функціями елементами. В іншому випадку, потрібно користуватися віртуальними. Хід роботи Реалізувати спадкування с пізнім зв’язуванням структури: «Спорт клубу». «Бібліотеки». «Обувного магазину» «Булочної» «Мобільного магазину» Тощо…