Зміст теми. Одиночне спадкування. Оголошення спадкування. Базовий клас. Створення похідних класів. Множинне спадкування. Діаграми класів. Зв'язки між класами.
Найбільш значущою після класів можливістю ООП є спадкування – процес створення нових класів, званих спадкоємцями або похідними класами, з вже існуючих, або базових, класів. Похідний клас отримує всі можливості базового класу, але може бути вдосконалений за рахунок додавання власних. Базовий клас при цьому залишається незмінним. Повторне використання кодів заощаджує час при розробці програм. Це сприяє повторному використанню перевіреного і наладженого коду і таким чином зменшує число проблем, що виникають після того, як система починає функціонувати.
Похідний клас в загальному випадку більший за свій базовий клас. Похідний клас більш специфічний по своєму призначенню, вужчий, чим його базовий клас, і представляє меншу групу об'єктів. Кожен об'єкт похідного класу є також об'єктом відповідного базового класу. Проте, зворотне невірно: об'єкт базового класу не є об'єктом класів, породжених цим базовим класом.
Наприклад, прямокутник є чотирикутником, але невірно стверджувати, що чотирикутник є прямокутником. В цьому випадку клас чотирикутник є базовим класом, а клас прямокутник - спадкоємцем класу або похідним класом.
Від будь-якого класу можна породити один або кілька підкласів (похідних класів), Похідні класи можуть бути базовими класами для інших похідних класів, у результаті чого сформується ієрархія класів. Батьківські класи зазвичай містять методи більш загального характеру, тоді як рішення специфічних завдань поручається похідним класам.
Наведемо приклад ієрархії спадкування. Типовий вищий навчальний заклад (ВНЗ) складається з тисячі людей, які є його членами. Ці люди діляться на студентів і службовців. Службовці – або члени факультету, або допоміжний персонал. Члени факультету – або адміністратори (декани і завідувачі кафедр), або викладачі. Це дає ієрархію спадкування, яка показана на рисунку 1.
Рисунок 1 – Ієрархія спадкування для членів ВНЗ
При простому (одиночному) спадкуванні клас породжується одним базовим класом (рисунок 2). При множинному спадкуванні похідний клас породжується декількома базовими класами (рисунок 3). Множинне спадкування дозволяє одному класу володіти властивостями двох і більш батьківських класів. Спадкування в UML називають узагальнення, і на діаграмі класів його зображають у вигляді стрілки. (Діаграма класів описує структуру системи, показуючи її класи, їх атрибути і методи, а також відносини (зв'язки), які існують між ними).
class А
{
. . .
}
class В: public А
{
. . .
};
Рисунок 2 – Одиночне спадкування на UML та С++
class С
{
. . .
}
class D: public A,C
{
.Рисунок 3 – Множинне спадкування на UML та С++
При описі класу в його заголовку перераховуються всі класи, що є для нього базовими. Можливість звернення до елементів цих класів регулюється за допомогою специфікаторів доступу private, protected і public. Якщо базових класів декілька, вони перераховуються через кому. Специфікатор доступу може стояти перед кожним класом. За замовчанням для класів використовується ключ доступу private. Тобто, спадкування може бути відкрите, закрите й захищене. У наведеному прикладі клас В оголошується похідним від класу А, спадкування – відкрите. При відкритому спадкуванні відкриті й захищені елементи базового класу успадковуються як відкриті й захищені елементи похідного класу відповідно.
Похідні класи успадковують члени-дані й члени-функції базового класу. Конструктори не успадковуються, тому похідний клас повинен мати власні конструктори, деструктори успадковуються. Порядок виклику конструкторів визначається наведеними нижче правилами:
якщо в конструкторі похідного класу явний виклик конструктора базового класу відсутній, автоматично викликається конструктор базового класу за замовчанням (тобто той, який можна викликати без параметрів);
для ієрархії, що складається з декількох рівнів, конструктори базових класів викликаються, починаючи з самого верхнього рівня. Після цього виконуються конструктори тих елементів класу, які є об'єктами, у порядку їх оголошення в класі, а потім виконується конструктор класу;
у разі декількох базових класів їх конструктори викликаються у порядку оголошення.
Зауваження. Якщо конструктор базового класу вимагає вказівки параметрів, він повинен бути явним чином викликаний в конструкторі похідного класу у списку ініціалізації.
Правила спадкування деструкторів:
Похідний клас не може мати доступ до закритих елементів свого базового класу (дозвіл такого доступу був би порушенням інкапсуляції базового класу), але має доступ до відкритих і захищених елементів свого базового класу. Похідний клас може мати доступ до закритих елементів свого базового класу тільки за допомогою функцій доступу, передбачених у відкритому інтерфейсі базового класу.
Запитання для самоконтролю