C++. Спадковість. Загальні поняття. Використання модифікаторів private, protected, public

Спадковість. Загальні поняття. Використання модифікаторів private, protected, public при спадковості


Зміст


Пошук на інших ресурсах:

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 наведено один з можливих варіантів утворення класами деревовидної ієрархії спадковості.

C++. Спадковість. Дерево спадковості, утворене класами

Рисунок 1. Спадковість. Дерево спадковості, утворене класами

 

3. Передача характеристик успадкованому класу. Варіанти реалізації. Обмеження та розширення доступу. Ключові слова private, protected, public

Важливим при успадкуванні є питання: як передати характеристики базового класу в успадкований клас? Тут C++ дає широкий спектр можливих варіантів реалізації.

Для вказання того, які саме елементи базового класу повинні бути доступні в успадкованому класі, використовується механізм інкапсуляції. В основі цього механізму лежить використання ключових слів private, protected, public для надання доступу чи заборони доступу до елементів базового класу.

 

3.1.Взаємодія двох класів. Доступ з успадкованого класу до елементів базового класу

Елемент базового класу (змінна, функція) може бути оголошений з одним з трьох модифікаторів доступу:

  • private (прихований). У цьому випадку доступу до цього елементу з успадкованого класу немає;
  • protected (захищений) – дозволяє використовувати елемент базового класу в успадкованому;
  • public (загальнодоступний) – в успадкованому класі діє так само як protected.

На рисунку 2 продемонстровано всі 3 види доступу для двох класів, що утворюють ієрархію спадковості. Демонструється доступ до змінної a базового класу A з функції Func() успадкованого класу B. Ті самі правила діють не тільки для змінних, а й для функцій базового класу A.

C++. Спадковість для двох класів A та B

Рисунок 2. Спадковість для двох класів A та B. До private-членів базового класу доступ з успадкованого класу заборонено. До protected– та public– членів базового класу доступ дозволено

 

3.2. Взаємодія двох класів. Доступ з екземпляру (об’єкту) успадкованого класу до елементів базового класу з використанням модифікаторів доступу private та protected

Якщо розглядати доступ з екземпляру (об’єкту) успадкованого класу до елементів базового класу, то відмінність від попереднього випадку (пункт 3.1) полягає у використанні ключового слова protected та в способі успадкування класу. Клас може бути успадкований як private, protected або public. Якщо клас успадкований як private, то ключове слово private вказувати не обов’язково (дивіться рисунок 2).

На рисунку 3 зображено можливі варіанти доступу до елементів базового класу з екземпляру успадкованого класу. У будь-якому варіанті успадкування базового класу, доступ до елементів цього класу з екземпляру похідного класу заборонений.

C++. Спадковість. Модифікатори доступу private, protected забороняють доступ до елементів класу

Рисунок 3. Модифікатори доступу private, protected забороняють доступ до елементів класу з будь-якого екземпляру класу

 

3.3. Взаємодія двох класів. Доступ до елементів базового класу з похідного класу. Модифікатор доступу public

Якщо у базовому класі A деякий елемент оголошується з модифікатором доступу public, то екземпляр успадкованого класу B:

  • має доступ до елементів базового класу A, якщо похідний клас B успадковує клас A з модифікатором доступу public;
  • не має доступу до елементів базового класу A, якщо похідний клас B успадковує клас A як private– або protected-.

На рисунку 4 наочно демонструється усі можливі варіанти такого доступу.

C++. Спадковість. Доступ до public-елементів базового класу

Рисунок 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 є заборонений.

C++. Спадковість. Заборонено доступ до елементів private-класу A з успадкованого класу C

Рисунок 5. Заборонено доступ до елементів private-класу A з успадкованого класу C

 

4.2. Доступ до protected– та public– базового класу з похідних класів

Якщо базовий клас A успадкований з модифікаторами protected або public, то елементи цього класу є доступні в успадкованих класах B та C.

C++. Спадковість. Модифікатори protected та public перед іменем базового класу

Рисунок 6. Модифікатори protected та public перед іменем базового класу. Відкриття доступу до protected– та public-елементів базового класу

 


Споріднені теми