Програмування С, С++теорія та практика (частина 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.
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86


