Правила спадкування

Спадкування, тобто породження одного класу з іншого, дозволяє повторно використовувати коди й структури даних, раніше створені для інших класів. Це робить програму зрозумілішою і допомагає в моделюванні взаємозв'язків між об'єктами, керованими програмою.

Похідний клас успадковує всі члени базового класу. У похідний клас можна додати нові члени для його настройки відповідно до вимог завдання.

Варіанти спадкування в мові C++ і результуючий доступ у похідних класах до членів базових класів залежно від специфікаторів, використаних при оголошенні змінних у базових класах, перелічені в табл. 7.1.

 

Таблиця 7.1

Варіанти спадкування членів базових класів

Специфікатор спадкування в оголошенні класу Специфікатор доступу до змінної в базовому класі Результуючий доступ до змінної у похідному класі
public public protected private public protected не доступні
protected public protected private protected protected не доступні
private public protected private private private не доступні
не заданий public protected private private private не доступні

 

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

 

class CWindow : public CFrame

{

// визначення класу

}

 

то в похідному класі відкриті члени базового класу залишаються відкритими, а захищені — захищеними.

Проте якщо в оголошенні похідного класу використаний специфікатор private, як показано нижче:

 

class CWindow : private CFrame

{

// визначення класу

}

 

то, виходячи з третього рядка таблиці, всі закриті й захищені члени базового класу стають закритими членами в похідному класі. Якщо в оголошенні похідного класу специфікатор не заданий, то за умовчанням спадкування оголошується як закрите.

Незалежно від способу спадкування закриті члени базового класу недоступні для похідного. Це означає, що не дивлячись на те, що вони успадковуються похідним класом і є частиною будь-якого об'єкту похідного класу, прямий доступ до них з похідного класу неможливий.

У мові C++ похідні класи майже завжди породжуються з використанням відкритого спадкування.

7.2.6 Ієрархії класів

Похідний клас може бути базовим для інших похідних класів. Використовуючи це, можна створювати ієрархії зв'язаних між собою класів. Наприклад, для створення закруглених вікон (тобто вікон із закругленими кутами), створимо похідний від CWindow клас, що називається CRoundWind:

 

class CRoundWind:public CWindow

{

protected:

int Radius;

public:

CRoundWind ()

{

int Radius = 0;

}

CRoundWind (int L, int T, int R, int B, int Color, int Rad)

:CWindow (L, T, R, B, Color)

{

SetRadius (Rad);

}

void Draw ()

{

// малює прозорий прямокутник із закругленнями,

// використовуючи значення Radius, а потім наступна функція

// виконує заливку прямокутника заданим кольором

Fill ((Left + Right) / 2 (Top + Bottom) / 2, FillColor);

}

void SetRadius (int Rad)

{

Radius = __max (0, Rad);

}

};

 

Клас CRoundWind називається прямим (direct) нащадком класу CWindow, який по відношенню до похідного є прямим базовим (direct base) класом, і непрямим (indirect) нащадком CFrame, що є для нього непрямим базовим (indirect base) класом.

Клас CRoundWind успадковує всі члени CWindow, включаючи успадковані класом CWindow з класу CFrame.

У класі CRoundWind оголошена додаткова змінна Radius для зберігання радіусу закруглення, а також нова версія функції Draw() для створення залитих прямокутників із закругленими кутами. Клас CRoundWind також надає відкриту функцію-член| SetRadius() для установки значення змінної Radius. Цей же клас має два конструктори: конструктор за умовчанням, що встановлює значення всіх змінних класу в 0, і конструктор, що ініціалізує всі змінні вказаними значеннями.

У наступному фрагменті програми створюється екземпляр класу RoundWind, ініціалізуються всі змінні-члени і малюється вікно із закругленими кутами:

 

CRoundWind RoundWind (10, 15, 50, 75, 5, 3);

RoundWind.Draw ();