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

Int kolesa; // Кількість коліс int pasagyr; // Кількість пасажирів public:

void setKolesa(int f) {kolesa = f;} int getKolesa() {return kolesa;}

void setPasagyr(int t) {pasagyr = t;} int getPasagyr() {return pasagyr;}

};

// Оголошення похідного класу вантажівок, class vanAuto: public dorZasib {

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

void setMistkist(int h) {mistkist = h;} int getMistkistO {return mistkist;}

void Show(char*s);

};

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 Show(char*s);

};

void vanAuto::Show(char*s)

{

cout«"Транспортний засіб:" « s « endl; cout«"коліс:" « getKolesaO «" шт"« endl; cout«"пасажирів:" « getPasagyr() «" осіб" « endl; cout«"вантажомісткість:"« mistkist«" м куб" « endl; cout« endl;

}

void lehAuto::Show(char*s)

{

cout«"Транспортний засіб:" « s « endl; cout«"коліс:" « getKolesa() <<" шт"<< er|dl; cout«"пасажирів:" « getPasagyrO «" осіб" « endl; cout«"тип:"; switch(getTypeO) {

case van: cout«"автофургон" « endl; break;

case car: cout«"легковий" « endl; break;

case wagon: cout«"фура" « endl;

}

cout« endl;

}

int mainO

{

vanAuto ObjT, ObjF; lehAuto ObjG;

// Ініціалізація об'єкта типу вантажівка ObjT.setKolesa(18);

ObjT.setPasagyr(2);

ObjT.setMistkist(160);

// Ініціалізація об'єкта типу вантажівка Obj F. setKo lesa (6);

ObjF.setPasagyr(3);

ObjF.setMistkist(8Q);

// Виведення інформації про об'єкт типу вантажівка ObjT.ShowfBam^iBKa 1");

ObjF.Show("Bam^iBKa 2");

// Ініціалізація об'єкта типу автомобіль ObjG.setKolesa(4);

ObjG.setPasagyr(6);

ObjG.setType(van);

// Виведення інформації про об'єкт типу автомобіль ObjG.Showf Автомобіль"); getchO; return 0;

}

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

Транспортний засіб: Вантажівка 1

коліс: 18 шт.

пасажирів: 2 осіб

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

Транспортний засіб: Вантажівка 2 коліс: 6 шт. пасажирів: 3 осіб вантажомісткість: 80 м куб.

Транспортний засіб: Автомобіль коліс: 4 шт. пасажирів: 6 осіб тип: автофургон

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

Вартоа нати! Зверніть увагу на те, що обидва класи VSnAllto і lehAuto міс­тять функцію-члена ShowQ, яка відображає інформацію про об'єкт. Ця фун­кція демонструє ще один аспект об’єктно-орієнтованого програмування - по­ліморфізм. Оскільки кожна функція ShowQ пов'язана з власним класом, компіля­тор може легко "зрозуміти", яку саме функцію потрібно викликати для цього об'єкта.

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

  1. Управління механізмом доступу до членів базового класу

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

го класу. Специфікатор доступу до членів базового класу виражається одним з ключових слів: public, private або protected. Якщо специфікатор доступу не вказано, то за замовчуванням використовується специфікатор private, коли йдеться про ус­падкування типу class. Якщо ж успадковується тип struct, то за відсутності безпо­середньо заданого специфікатора доступу використовується специфікатор public.

Якщо базовий клас успадковується як public-клас, та всі його риЬІІС-чле- ни стають public-членами похідного класу.

Розглянемо поки що раміфікацію (розгалуження) використання специфікато­рів доступу до членів класу public або private1 (рис. 5.1).

Успадкування,

Визначення базового класу

.базового класу

Спец»

public

public

private

protected

<

і

Г

X

Похідний клас

public

private

protected

Доступні

члени

Не

доступні

члени

Доступні

члени


private

public

private

protected

1

t

>

f

X

f

мкатори доступу,

до членів базового класу

Похідний клас

private

private

private

Доступні

члени

He

доступні

члени

Доступні

члени

protected

public

private

protected

f >

f x

r

Похідний клас

protected

protected

protected

He

доступні

члени

He

доступні

члени

Доступні

члени

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

В усіх випадках private-члени базового класу залишаються закритими у межах цього класу і не доступні для членів похідного. Наприклад, у наведеному нижче коді програми public-члени класу baseClass стають public-членами класу derived. От­же, вони будуть доступними і для інших частин програми.

Код програми 5.2. Демонстрація механізму доступу до членів базового класу після їх успадковується як риЬІІс-клас

#include <vcl>

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

#include <conio> // Для консольного режиму роботи

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

class baseClass { // Оголошення базового класу int с, d; public:

void setB(int a, int b) {c = a; d = b;} void showB(char *s)

{cout« s «"c=" « c «d=" « d « endl;}

};

// Оголошення похідного класу class derived: public baseClass { intf; public:

derived(int x) {f = x;} void showF(char*b, char*p)

{showB(b); cout« p «"f= f« endl;}

};

int mainO

{

derived ObjD(3);

// Доступ до членів класу baseClass ObjD.setB(1,2);

// Доступ до членів класу baseClass ObjD.showB("Ba30BHÜ клас:"); cout« endl;

// Доступ до члена класу derived ObjD.showF("Ba30BHÜ клас:", "Похідний клас:");

getchO; return 0;

}

Внаслідок виконання ця програма відображає на екрані такі результати: Базовий клас: с= 1; d= 2

Базовий клас: с= 1; d= 2 Похідний клас: f= З

Оскільки функції setBO і showBO (члени класу baseClass) успадковані класом de­rived як public-члени, то їх можна викликати для об'єкта типу derived у функції main(). Позаяк члени даних с та d визначені як private-члени, то вони залишаються закри­тими у межах свого класу baseClass.

Протилежністю відкритому (public) успадкуванню є закрите (private).

class baseClass { // Оголошення базового класу int с, d; public:

void setB(int a, int b) {c = a; d = b;}

void showB(char *s) {cout« s «"c=" « c «d=" « d « endl;}

};

// Відкриті члени класу baseClass тепер стають закритими членами класу derived, class derived: private baseClass { int f; public:

derived(int x) {f = x;}

void showF(char*b, char*p) {showB(b); cout« p «"f=" «f« endl;}

};