Спадковість. Загальні поняття. Використання модифікаторів private, protected, public при спадковості
Зміст
- 1. Повторне використання коду. Спадковість
- 2. Синтаксис оголошення класів, що утворюють ієрархію. Базовий клас та похідний (успадкований) клас
- 3. Передача характеристик успадкованому класу. Варіанти реалізації. Обмеження та розширення доступу. Ключові слова private, protected, public
- 3.1.Взаємодія двох класів. Доступ з успадкованого класу до елементів базового класу
- 3.2. Взаємодія двох класів. Доступ з екземпляру (об’єкту) успадкованого класу до елементів базового класу з використанням модифікаторів доступу private та protected
- 3.3. Взаємодія двох класів. Доступ до елементів базового класу з похідного класу. Модифікатор доступу public
- 4. Успадкування 3-х і більше класів. Доступ з успадкованих класів
- Споріднені теми
Пошук на інших ресурсах:
1. Повторне використання коду. Спадковість
Ідея спадковості у програмуванні запозичена з природи і починається ще з 60-х років 20 століття. У мові C++ концепція класів значно підсилюється завдяки впровадженню спадковості у класах. У природі спадковість дозволяє додавати до батьківських якостей нові навички. У програмуванні спадковість – це властивість класу отримувати програмний код (навички) іншого (базового) класу, додаючи до нього свій власний код, тим сами розширюючи його можливості.
З допомогою механізму спадковості можна без обмежень змінювати будь-який клас, що був розроблений власне програмістом або іншими програмістами. При цьому не потрібно перебудувати структуру цього класу. У базовий клас, додаються нові можливості. Можливості базового класу в успадкованому класі можуть бути розширені, змінені, звужені, знищені чи залишені без змін.
Спадковість властива тільки класам та їх характеристикам, а не змінним чи функціям.
Проекти на мові C++ базуються на використання конкретних класів, що розв’язують поставлені задачі. Завдяки використанню спадковості класи будуються поступово, від базових простих класів до спеціалізованих класів, які поступово деталізують розв’язок. У результаті класи утворюють ієрархії класів. У цих ієрархіях класи верхніх рівнів (базові класи) описують деякі спільні, чи загальні для всіх, характеристики, які на нижніх рівнях деталізуються в успадкованих класах. Завершений програмний проект є працездатною системою, що складається з ієрархічно зв’язаних між собою класів. Кількість класів у деяких проектах може складати десятки чи сотні.
На відміну від деяких мов програмування, у мові C++ дозволяється множинна спадковість. При множинній спадковості один клас може бути успадкованим з декількох базових класів, отримуючи їх властивості та поведінку.
В контексті поняття спадковості визначається поняття повторного використання коду, яке у програмуванні на C++ визначене двома аспектами:
- створення класу з метою отримання екземплярів класу;
- створення класу для його використання в якості базового, який передає свої характеристики успадкованим класам.
Породження коду від базового класу є ефективним способом використання вже написаного коду для власних потреб. Спадковість є одним з елементів повторного використання коду.
⇑
2. Синтаксис оголошення класів, що утворюють ієрархію. Базовий клас та похідний (успадкований) клас
Для реалізації спадковості, потрібно наявність як мінімум двох класів. Якщо в програмі клас з іменем B повинен бути успадкований від класу з іменем A, то оголошення класів має вигляд:
class A { // Елементи класу A // ... }; class B : A { // Складові елементи класу B // ... };
У вищенаведеному оголошенні клас B успадковує частину характеристик або всі характеристики класу A. З класу B може бути успадкований інший (третій) клас, який отримає частину або всі характеристики класів A та B. Крім того, з класу A може бути успадковано один або декілька класів, які по відношенню до класу B утворюють паралельну гілку ієрархії. На рисунку 1 наведено один з можливих варіантів утворення класами деревовидної ієрархії спадковості.
Рисунок 1. Спадковість. Дерево спадковості, утворене класами
⇑
3. Передача характеристик успадкованому класу. Варіанти реалізації. Обмеження та розширення доступу. Ключові слова private, protected, public
Важливим при успадкуванні є питання: як передати характеристики базового класу в успадкований клас? Тут C++ дає широкий спектр можливих варіантів реалізації.
Для вказання того, які саме елементи базового класу повинні бути доступні в успадкованому класі, використовується механізм інкапсуляції. В основі цього механізму лежить використання ключових слів private, protected, public для надання доступу чи заборони доступу до елементів базового класу.
⇑
3.1.Взаємодія двох класів. Доступ з успадкованого класу до елементів базового класу
Елемент базового класу (змінна, функція) може бути оголошений з одним з трьох модифікаторів доступу:
- private (прихований). У цьому випадку доступу до цього елементу з успадкованого класу немає;
- protected (захищений) – дозволяє використовувати елемент базового класу в успадкованому;
- public (загальнодоступний) – в успадкованому класі діє так само як protected.
На рисунку 2 продемонстровано всі 3 види доступу для двох класів, що утворюють ієрархію спадковості. Демонструється доступ до змінної a базового класу A з функції Func() успадкованого класу B. Ті самі правила діють не тільки для змінних, а й для функцій базового класу A.
Рисунок 2. Спадковість для двох класів A та B. До private-членів базового класу доступ з успадкованого класу заборонено. До protected– та public– членів базового класу доступ дозволено
⇑
3.2. Взаємодія двох класів. Доступ з екземпляру (об’єкту) успадкованого класу до елементів базового класу з використанням модифікаторів доступу private та protected
Якщо розглядати доступ з екземпляру (об’єкту) успадкованого класу до елементів базового класу, то відмінність від попереднього випадку (пункт 3.1) полягає у використанні ключового слова protected та в способі успадкування класу. Клас може бути успадкований як private, protected або public. Якщо клас успадкований як private, то ключове слово private вказувати не обов’язково (дивіться рисунок 2).
На рисунку 3 зображено можливі варіанти доступу до елементів базового класу з екземпляру успадкованого класу. У будь-якому варіанті успадкування базового класу, доступ до елементів цього класу з екземпляру похідного класу заборонений.
Рисунок 3. Модифікатори доступу private, protected забороняють доступ до елементів класу з будь-якого екземпляру класу
⇑
3.3. Взаємодія двох класів. Доступ до елементів базового класу з похідного класу. Модифікатор доступу public
Якщо у базовому класі A деякий елемент оголошується з модифікатором доступу public, то екземпляр успадкованого класу B:
- має доступ до елементів базового класу A, якщо похідний клас B успадковує клас A з модифікатором доступу public;
- не має доступу до елементів базового класу A, якщо похідний клас B успадковує клас A як private– або protected-.
На рисунку 4 наочно демонструється усі можливі варіанти такого доступу.
Рисунок 4. Доступ до public-елементів базового класу: 1) базовий клас успадкований як private-клас; 2) базовий клас успадкований як protected-клас; 3) базовий клас успадкований як public-клас.
⇑
4. Успадкування 3-х і більше класів. Доступ з успадкованих класів
Як було показано вище, базовий клас може бути успадкований шляхом вказання перед його іменем модифікаторів private, protected, public. Відмінність у використанні цих модифікаторів проявляється у класі, що є похідним класом від успадкованого класу. Тобто, якщо дано три класи з іменами A, B, C, які послідовно успадковують один одного, то вплив модифікаторів буде саме на клас C.
⇑
4.1. Доступ до private-базового класу з похідних класів
На рисунку 5 зображено доступ до базового класу A з похідного класу C. Клас A у класі B успадковується як private-клас (прихований). Це означає, що доступ до будь-якого елементу класу A з похідного класу C є заборонений.
Рисунок 5. Заборонено доступ до елементів private-класу A з успадкованого класу C
⇑
4.2. Доступ до protected– та public– базового класу з похідних класів
Якщо базовий клас A успадкований з модифікаторами protected або public, то елементи цього класу є доступні в успадкованих класах B та C.
Рисунок 6. Модифікатори protected та public перед іменем базового класу. Відкриття доступу до protected– та public-елементів базового класу
⇑
Споріднені теми
- Порядок виклику конструкторів при спадковості. Обмеження спадковості. Властивості покажчика на базовий клас
- Поліморфізм. Віртуальні функції. Загальні поняття. специфікатори virtual, override. Приклади
- Абстрактний клас. Чисто віртуальна функція. Приклади
⇑