Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in /home/studb20/public_html/index.php on line 4
 2.6.1 Механізм успадкування - Програмування С, С++теорія та практика (частина 2) - Studbook

Програмування С, С++теорія та практика (частина 2)

2.6.1 Механізм успадкування

Успадкування - це співвідношення між класами, коли один клас використовує структурну або функціональну частину іншого (інших) класів.

Для початку розглянемо структуру звичайного класу, що має справу з описом людей, які працюють на одній фірмі. Пропонується така структура: с1азз етр1оуее

{                      // тип - клас «службовець»

сЬаг *пате;         / /                           ім' я

зЬог^ аде;          / /                             вік

зЬог^ гіераг'Ьтеп'Ь;   / / відділ

іп£ за1агу;         //                         зарплата

етр1оуее *пех£;     / /  покажчик на представника класу

}

Список однотипних службовців буде пов’язаний через поле пехі. Тепер окремо визначимо клас тападег:

с1азз тападег {

етр1оуее етр; // запис про менеджера як службовця етр1оуее *дгоир;

// підпорядковані службовці менеджера зЬогЬ 1еVе1 ;     / / рівень та інші характеристики

}

Таким чином, дані, що відносяться до службовця етрІоуее, зберігаються в члені етр класу тападег. Все ніби очевидно, однак для компілятора немає вказівки, що покажчик на менеджера тападег* є покажчиком на службовця етрІоуее * , виходячи з контексту структури. Більше того, зовсім немає нічого такого, що виокремлює член класу тападег етр, що є типом етрІоуее. Можна, звичайно, написати спеціальний код , що застосовує до тападег* явне перетворення типу, або розмістити у списку службовців адресу члена етр - все це заслуговує на увагу, але й на додаткові витрати. Проте коректний підхід тут полягатиме саме у застосуванні механізму успадкування, аби встановити, що менеджер є службовцем з деякою допоміжною інформацією, тобто встановити, що один з класів (похідний) в якійсь мірі містить, повторює функціональну частину іншого (базового) класу.

Синтаксис успадкування:

сІа55 Ва5е{

// протокол базового класу

};

сІа55 Оегіуесі: [риЬІІс/ргоїесїесІ/ргІуаїе] Ва5е {

//протокол похідного класу

};

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

с1азз етр1оуее // тип - клас «службовець»

{

// протокольна частина класу етр1оуее

};

с1азз тападег: етр1оуее {

// протокольна частина класу тападег

};

У нашому випадку клас тападег є похідним класом від класу етріоуее, а клас етріоуее є базовим класом для класу тападег, що можна відобразити наступною схемою:

Рис. 2.1. Схема відношення успідкування між класами

 

У такому випадку об’єкт похідного класу додатково до власного члена дгоир матиме члени класу етріоуее (пате, аде и т.д.), що в принципі відповідає логіці даної задачі. Маючи визначення вищеописаних класів, можна створити список службовців, деякі з котрих є менеджерами, що наведено нижче.

VОІЙ £()

{

тападег т1, т2; етр1оуее е1, е2; етр1оуее* е1із£;

е1із£ = &т1;   // розмістити ті, еі, т2 та е2 в еіікі

т1.пех£ = &е1; е1.пех£ = &т2; т2.пехї = &е2;

}

Рис. 2.2. Покажчик на базовий клас (1) та покажчик на похідний клас (2)

 

Звернемо увагу на таке: оскільки менеджер є службовцем, покажчик на етріоуее може посилатися не тільки на об’єкт свого класу, але й на похідний об’єкт класу - тападег. Однак службовець необов’язково є менеджером, тому використовувати етріоуее* замість тападег * є неможливим. Саме це відображено на рис. 2.2.

 

30