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.2 Керування доступом при успадкуванні - Програмування С, С++теорія та практика (частина 2) - Studbook
Главная->Інформатика та програмування->Содержание->2.6.2 Керування доступом при успадкуванні

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

2.6.2 Керування доступом при успадкуванні

Повернемося до синтаксису успадкування. Специфікатори доступу

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

•         якщо визначається сіа&8, то по замовчуванню похідний клас приймається як ргіуаіе;

•         якщо доступ не вказаний в успадкуванні при описі хігисі, то по замовчуванню він приймається як риЬііс;

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

Таблиця 2.2. Рівні доступу у базових та похідних класах при

успадкуванні

Тип успадкування с/азз А: []сіа88 В

Доступ у базовому класі А

Доступ у похідному класі В

 

ргіуаїе

недоступно

риЬііс

риЬііс

риЬііс

 

ргоїесїесі

ргоїесїеС

 

ргіуаїе

недоступно

ргічаіе

риЬііс

ргіуаїе

 

ргоїесїеС

ргіуаїе

 

ргіуаїе

недоступно

ргоіесіеб

риЬііс

ргоїесїеС

 

ргоїесїеС

ргоїесїеС

 

З цієї таблиці, видно, які можливості надає механізм успадкування. Так,           при         відкритому успадкуванні               риЬІіс

загальнодоступні та захищені елементи-дані зберігають свої рівні доступу надалі, і лише ргіуаіе-елементи виявляються недоступними вниз по ієрархії.

Слід дотримуватися наступних правил успадкування методів у похідному класі:

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() доступною як риЬііс

};

 

31