Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
7
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

15.1. Поняття про успадкування

Мова програмування C++ підтримує механізм успадкування, даючи змогу в оголошенні класу вбудовувати інший клас. Для цього базовий клас задається під час оголошення похідного. Щоб зрозуміти сказане, краще почнемо з конкретного прикладу. Розглянемо клас dorZasib, який у найзагальніших рисах визначає дорожній транспортний засіб. Його члени даних дають змогу зберігати наявну кількість коліс і можливу кількість пасажирів, яких може перевозити транспортний засіб:

// Оголошення класу, що визначає дорожній транспортний засіб

class dorZasib {

int kolesa; // Кількість коліс

int pasagyry; // Кількість пасажирів

public:

void setKolesa(int kzm) { kolesa = kzm;}

int getKolesa() { return kolesa;}

void setPasagyry(int p) { pasagyry = p;}

int getPasagyry() { return pasagyry;}

};

Це загальне визначення дорожнього транспортного засобу можна використовувати для| визначення будь-якого конкретного типу автотранспортну. Наприклад, у наведеному нижче коді програми шляхом успадкування класу dorZasib створює клас vanAuto (вантажних автомобілів):

class vanAuto : public dorZasib {

int mistkist; // вантажомісткість у м куб.

public:

void setMistkist(int mzm) { mistkist = mzm;}

int getMistkist() { return mistkist;}

void showRez();

};

Той факт, що клас vanAuto успадковує клас dorZasib, означає, що клас vanAuto успадковує весь вміст класу dorZasib. До вмісту класу dorZasib клас vanAuto додає члена даних mistkist, а також функції-члени, необхідні для підтримки члена mistkist.

Базовий клас успадковується похідним класом.

Звернемо Вашу увагу на те, як успадковується клас dorZasib. Загальний формат для забезпечення успадкування має такий вигляд:

class ім'я_похідного_класу : доступ ім'я_базового_класу

{

тіло нового класу

}

У цьому оголошенні елемент доступ є необов'язковим. У разі потреби він може бути виражений одним із специфікаторів доступу: public, private або protected. Грунтовніше про ці специфікатори доступу можна дізнатися нижче у цьому розділі. А поки що у визначеннях усіх успадкованих класів будемо використовувати специфікатор public. Це означає, що всі public-члени базового класу також будуть public-членами похідного класу. Отже, у попередньому прикладі члени класу vanAuto мають доступ до відкритих функцій-членів класу dorZasib, неначе вони (ці функції) були оголошені в тілі класу vanAuto. Проте клас vanAuto не має доступу до private-членів класу dorZasib. Наприклад, для класу vanAuto закритий доступ до члена даних kolesa.

Розглянемо програму, яка використовує механізм успадкування для створення двох підкласів класу dorZasib: vanAuto і lehAuto.

Код програми 15.1. Демонстрація механізму застосування успадкування

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

// Оголошення базового класу транспортних засобів

class dorZasib {

int kolesa; // Кількість коліс

int pasagyry; // Кількість пасажирів

public:

void setKolesa(int kzm) { kolesa = kzm;}

int getKolesa() { return kolesa;}

void setPasagyry(int p) { pasagyry = p;}

int getPasagyry() { return pasagyry;}

};

// Оголошення похідного класу вантажівок.

class vanAuto : public dorZasib {

int mistkist; // вантажомісткість у м куб.

public:

void setMistkist(int mzm) { mistkist = mzm;}

int getMistkist() { return mistkist;}

void showRez();

};

enum type {car, van, wagon};

// Оголошення похідного класу автомобілів.

class lehAuto : public dorZasib {

enum type carType;

public:

void setType(type t) { carType = t;}

enum type getType() { return carType;}

void showRez();

};

void vanAuto::showRez()

{

cout << "коліс: " << getKolesa() << "\n";

cout << "пасажирів: " << getPasagyry() << "\n";

cout << "вантажомісткість у м куб.: " << mistkist << "\n";

}

void lehAuto::showRez()

{

cout << "коліс: " << getKolesa() << "\n";

cout << "пасажирів: " << getPasagyry() << "\n";

cout << "тип: ";

switch(getType()) {

case van: cout << "автофургон\n";

break;

case car: cout << "легковий\n";

break;

case wagon: cout << "фура\n";

}

}

int main()

{

vanAuto T_ob, F_ob;

lehAuto G_ob;

// Ініціалізація об'єкта типу вантажівка

T_ob.setKolesa(18);

T_ob.setPasagyry(2);

T_ob.setMistkist(160);

// Ініціалізація об'єкта типу вантажівка

F_ob.setKolesa(6);

F_ob.setPasagyry(3);

F_ob.setMistkist(80);

// Виведення інформації про об'єкт типу вантажівка

T_ob.showRez();

cout << "\n";

F_ob.showRez();

cout << "\n";

// Ініціалізація об'єкта типу автомобіль

G_ob.setKolesa(4);

G_ob.setPasagyry(6);

G_ob.setType(van);

// Виведення інформації про об'єкт типу автомобіль

G_ob.showRez();

getch(); return 0;

}

У процесі виконання ця програма відображає на екрані такі результати:

коліс: 18

пасажирів: 2

вантажомісткість у м куб.: 160

коліс: 6

пасажирів: 3

вантажомісткість у м куб.: 80

коліс: 4

пасажирів: 6

тип: автофургон

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

Варто знати! Звернемо Вашу увагу на те, що обидва класи vanAuto і lehAuto містять функцію-члена showRez(), яка відображає інформацію про об'єкт. Ця функція демонструє ще один аспект об'єктно-орієнтованого програмування – поліморфізм. Оскільки кожна функція showRez() пов'язана з власним класом, компілятор може легко "зрозуміти", яку саме функцію потрібно викликати для даного об'єкта.

Після поверхневого ознайомлення із загальною процедурою успадкування одним класом іншого можна перейти і до деталей цієї теми.