Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Class CountOn:public Counter //похідний клас

Поиск

 

Для цього використовується знак двокрапки (не плутати з подвійною двокрапкою операції глобального дозволу), після нього – слово public та ім’я базового класу Counter. Іншими словами, цей рядок повідомляє нам, що CountOn є спадкоємцем класу Counter.

 

Доступ до базового класу

Важливим компонентом успадковування є знання того, коли для об’єктів похідного типу можуть бути використані методи базового класу. Розглянемо їх на прикладі програми 11.1.

Підстановка конструкторів базового класу

Створимо об’єкт класу CountOn в функції main()

CountOn c1;

Цей рядок означає, що с1 буде створений як об’єкт класу CountOn та ініціалізований нулем. Але клас CountOn не має конструктора, яким же чином виконається ініціалізація? Виявляється, якщо ми не визначили конструктор похідного класу, то буде використовуватися підходящий за сигнатурою конструктор базового класу. В даному випадку компілятор використовує конструктор класу Counter без аргументів.

 

Підстановка методів базового класу

Об’єкт с1 класу CounOn також може використовувати методи operator++() та get_count() з базового класу:

++c1;

cout <<"\nc1="<<c1.get_count();

Компілятор, не знайшовши цих методів в класі, об’єктом якого є с1, використовує методи базового класу.

 

Специфікатор доступу protected

Ми навчилися розширювати можливості класу, майже не модифікуючи його код. Розглянемо, що ж ми все-таки поміняли в класі Counter.

Дані класу, з яким ми раніше познайомилися, мали специфікатор доступу private. В програмі 11.1 ми використовуємо інший специфікатор доступу – protected. Розглянемо його призначення.

Згадаємо, що нам відомо про специфікатори доступу private і public. У методів класу є доступ до членів (полів і методів) класу, якщо вони мають будь-який з цих специфікаторів. Але при використанні об’єкту, оголошеного в програмі, можна дістати доступ тільки до даних зі специфікатором public. Однак при використанні успадковування в нас з’являється ряд додаткових можливостей. Виникає питання, чи можуть методи похідного класу мати доступ до членів базового класу? Це можливо тоді, коли ці члени мають специфікатор доступу public або protected. До членів, оголошених як private, доступу нема.

Член, оголошений як protected, доступний методам свого класу і методам будь-якого похідного класу. При цьому він не буде доступним з функцій, які не належать до цих класів, наприклад, з функції main().

Далі приведена таблиця, яка відображає можливості використання специфікаторів доступу в різних ситуаціях.

Специфікатор доступу Доступ з самого класу Доступ з похідних класів Доступ із зовнішніх класів та функцій
public + + +
protected + + -
private + - -

 

Таким чином, якщо ми пишемо клас, який пізніше буде використовуватися як базовий при успадковуванні, то дані, до яких треба мати доступ, слід оголошувати як protected.

 

Недоліки використання специфікатора protected

Використання специфікатора protected має недоліки. Припустімо, ми написали бібліотеку класів і публічно її поширюємо. Будь-який програміст може дістати доступ до членів класу, оголошених як protected, просто створюючи похідні класи. Це робить члени, оголошені як protected, значно менш захищеними, ніж оголошені як private. Щоб уникнути спотворення даних, часто доводиться дозволяти доступ похідним класам тільки до тих методів базового класу, що оголошені як public. Однак використання специфікатора доступу protected спрощує програмування.

 

Незмінність базового класу

Згадаємо, що при успадковуванні базисний клас залишається незмінним. В функції main() програми 11.1 ми визначили об’єкт типу Counter

Counter c2;

Такі об’єкти поводяться так, начебто клас CountOn не існує.

Зауважимо також, що успадковування не працює в зворотньому напрямку. Базовому класу і його об’єктам недоступні похідні класи. В нашому випадку це означає, що об’єкти типу Counter не можуть використовувати метод operator—() класу CountOn. Якщо ми хочемо мати можливість зменшувати лічильник, то об’єкт повинен бути класу CountOn.

 



Поделиться:


Последнее изменение этой страницы: 2021-12-15; просмотров: 52; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.119.142.113 (0.005 с.)