Програмування С, С++теорія та практика (частина 2)
2.6.2 Керування доступом при успадкуванні
Повернемося до синтаксису успадкування. Специфікатори доступу
- риЬііс, ргіуаіе, ргоіеєіесі при призначенні типу успадкування можуть пропускатися (як, до речі, і було у нашому першому прикладі зі службовцями та менеджерами), при цьому керуються наступними правилами:
• якщо визначається сіа&8, то по замовчуванню похідний клас приймається як ргіуаіе;
• якщо доступ не вказаний в успадкуванні при описі хігисі, то по замовчуванню він приймається як риЬііс;
Наступна таблиця містить визначення рівня доступу в середині похідного класу. У першій колонці - специфікатор доступу, що визначає успадкування між класами, у двох подальших - рівень доступу у базовому та похідному класах:
|
Таблиця 2.2. Рівні доступу у базових та похідних класах при успадкуванні
|
З цієї таблиці, видно, які можливості надає механізм успадкування. Так, при відкритому успадкуванні риЬІіс
загальнодоступні та захищені елементи-дані зберігають свої рівні доступу надалі, і лише ргіуаіе-елементи виявляються недоступними вниз по ієрархії.
Слід дотримуватися наступних правил успадкування методів у похідному класі:
1. Оскільки конструктори не успадковуються, похідні класи повинні мати власні конструктори. Тут можуть бути дві ситуації:
• якщо у конструкторі похідного класу відсутній явний виклик конструктора базового класу, автоматично викликається конструктор базового класу по замовчуванню (той, що не має параметрів). Для ієрархії декількох рівнів конструктори базових класів викликаються, починаючи з найвищого рівня.
• якщо конструктор базового класу потребує вказівку
параметрів, він повинен бути явно викликаний в конструкторі похідного класу списком ініціалізації (див. розділ 2.5.5. "Методи ініціалізації елементів у
конструкторах").
2. Оскільки деструктор не успадковуються та програмою не визначений деструктор у похідному класі, його буде згенеровано по замовчуванню і через нього викликано деструктори усіх базових класів. У класовій ієрархії деструктори викликаються у порядку, зворотному до виклику конструкторів; спочатку деструктор поточного класу, а потім деструктор базового класу.
3. Похідний клас може перевизначати метод з одним і тим же ім’ям, що і у базовому класі, відповідно коректуючи його поведінку для себе. Аби запобігти неоднозначностям, рекомендовано перевизначати лише віртуальні методи класів (див. розділ 2.7 "Поліморфізм").
0(х,у)
О
І
Сігсіе
|
Рис. 2.3. Приклад простого успадкування Надалі розглянемо приклад простого успадкування. Від класу точки Роіпі утворимо клас кола Сігсіе, а від нього - похідні класи - Сопе (конус) та Суііпіїег (циліндр). Нижче наведений код демонструє взаємозв’язок елементів-даних та елементів-функцій базового та похідного класів. /* приклад розробки базового та похідних класів */ #іпс1ийе<з'Ьйіо. Ь> #гіе£іпе рі 3.1415926 // протоколи класів |
с1азз Роіп£
{
рго'Ьес'Ьей:
£1оа£ х,у; риЬ1іс:
Роіп'Ь(£1оа'Ь _х1,£1оа£ _у1) ;
};
с1азз Сігс1е:риЬ1іс Роіп£
{
рго'Ьес'Ьей:
£1оа£ г; риЬ1іс:
Сігс1е(£1оа^ _х,£1оа£ _у,£1оа£ _г);
£1оа£ де£_з();
};
с1азз Сі1іпйег:риЬ1іс Сігс1е {
£1оа£ Ь; риЬ1іс:
Сі1іпйег(іп^ _х,іп£ _у,іп£ _г,іп^ _Ь);
£1оа£ де■Ь_V() ;
};
с1азз Сопе:риЬ1іс Сігс1е {
£1оа£ Ь; риЬ1іс:
Сопе(іп£ _х,іп£ _у,іп£ _г,іп^ _Ь);
£1оа£ де^_V();
}
//реалізація функцій класів Роіп£::Роіп'Ь(£1оа'Ь _х,£1оа£ _у)
{
х=_х;
у=_у;
};
Сігс1е::Сігс1е(£1оа^ _х,£1оа£ _у,£1оа£ _г):Роіп£(_х,_у) {
г=_г;
}
Сі1іпйег::Сі1іпйег(іп^ _х,іп£ _у,іп£ _г,іп^ _Ь) :
Сігс1е(_х,_у,_г)
{
Ь=_Ь;
};
£1оа£ Сігс1е::де^_з()
{
ге'Ьигп рі*г*г;
£1оа£ Сі1іпСег::де£_^()
{
ге'Ьигп де£_з()*Ь;
}
Сопе::Сопе(іп£ _х,іп£ _у,іп£ _г,іпї _Ь): сігс1е(_х,_у,_г)
{
Ь=_Ь;
}
£1оа£ Сопе::де£_^()
{
ге'Ьигп Ь*де£_з () ;
}
VОіС таіп ()
{
Сі1іпСег сі1(1,1,10,20);
Сопе соп(100,100,15,100);
ргіп'Ь£("сі1іпСег:8осн=%.2£ У=%.2£\п",сі1.де'Ь_з(),
сі1. де£_^) ) ; ргіп^£("сопе :8осн=%.2£ У=%.2£\п",соп.де'Ь_з(),
соп.де£_^());
}
Слід відмітити, що у базовому класі Роіпі значення х та у віднесені до захищеної частини (ргоіесіей). Якщо їх віднести до закритої (ртіуаіе) секції класу, то у похідних класах Сігсіе, Сопе та Сіііпіїег вони будуть недоступними.
До речі, як видно з наведеної у цьому розділі таблиці визначення рівня доступу в середині похідного класу, якщо базовий клас успадковується як ргіуаіе, його елементи типу риЬііс будуть ргіуаіе- елементами у похідному класі. Однак можна вибірково деякі з елементів базового класу зробити риЬііс-елементами у похідному класі, явно вказавши їх у секції риЬііс похідного класу: с1азз Вазе {
риЬ1іс:
VОіс^ £ипс1() ;
VОіс^ £ипс2 () ;
};
с1азз Вазе1:рг^а£е Вазе {
риЬ1іс:
Вазе: :£ипс1() ; //робить уоігї Ва§е::&пс1() доступною як риЬііс
};
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
Схожі підручники
- Соціологія Навчально-методичний посібник для студентів всіх напрямків (частина 1)
- Розрахункова робота з курсу Економыка Пыдприэмства
- Загальні питання з курсу «Теорія ймовірності та Математичної статистики»№1
- МЕТОДИЧНІ ВКАЗІВКИ ДO ВИКОНАННЯ ІНДИВІДУАЛЬНИХ ЗАВДАНЬ З КУРСУ «Професійна психологія та конфліктологія»
- Сказка про Весельчака
- конспект з курсу Філософія

