Вступ
Віртуальні функції
Доступ до звичайних методів через вказівники
Доступ до віртуальних методів через вказівники
Пізнє зв’язування
Абстрактні класи і чисті віртуальні функції
Приклад використання віртуальних функцій
Віртуальні деструктори
Віртуальні базові класи
Дружні функції
Дружні функції як мости між класами
Приклад використання дружніх функцій
Дружність і функціональний запис
Дружні класи
Статичні функції
Доступ до статичних функцій
Ініціалізація копіювання і присвоювання
Перезавантаження оператора присвоювання
Конструктор копіювання
Ефективне використання пам’яті класом String
Вказівник this
Доступ до компонентних даних через вказівник this
Використання this для повернення значення
Удосконалена програма роботи з типом String
Уникайте неправильних присвоювань
Підсумок
Питання по темі
Вступ
У цій темі вивчаються віртуальні функції, дружні функції, статичні функції, перезавантажувані операції та методи і вказівник this. Всі вони є прогресивними особливостями мови, однак не всюди їх варто використовувати. Невеликі програми можуть обійтися і без них. Тим не менше, вони часто використовуються і дуже важливі для великих серйозних програм. Зокрема, віртуальні функції необхідні при використанні поліморфізму – одного з основоположних принципів ООП.
Віртуальні функції
Поняття віртуалізації нам вже знайоме з вивчення Паскалю. Коли використовуються віртуальні функції, програма, яка нібито викликає функцію одного класу, насправді викликає функцію іншого класу. В результаті виконання методу залежить від того, який саме об’єкт його викликає.
Для чого взагалі потрібні віртуальні функції? Уявимо собі, що ми створили набір об’єктів різних класів (масив, стек, чергу і т.п.), але ми хочемо, щоб вони самі і дії з ними викликалися за допомогою того самого виразу. ООП надає нам таку можливість завдяки притаманному цьому підходу поліморфізму, тобто набору різноманітних форм. Поліморфізм, поряд з класами та успадковуванням, є основоположним принципом ООП.
Щоб використовувати поліморфізм, необхідно виконати певні умови. По-перше, всі класи повинні бути спадкоємцями одного базового класу, по-друге, функція має бути оголошена як віртуальна у базовому класі (на відміну від Паскалю, в С++ достатньо оголосити про віртуальність методу один раз).