Роль успадковування при розробці програм 


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



ЗНАЕТЕ ЛИ ВЫ?

Роль успадковування при розробці програм



Процес розробки програм серйозно змінився після появи ООП. Це зв’язано не лише з використанням класів, але і з використанням успадковування. Розглянемо його етапи.

Нехай програміст А створює певний клас. Програмісту В подобається цей клас, але він вирішує його удосконалити, додавши якісь нові члени. Він, в свою чергу, створює клас, похідний від першого.

Наступний програміст може не мати доступу до вихідного коду, написаного програмістом А чи програмістом В. Але в С++ існує можливість повторного використання коду, тому і цей третій програміст може використовувати і доповнювати роботу своїх попередників.

Зауважимо, що при такій організації роботи відмінності між розробниками системного і прикладного програмного забезпечення стають неістотними. Отож ООП робить програмування більш гнучким і, в той же час, складнішим.

 

Підсумок

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

Важливим питанням є доступність членів базового класу для методів похідних класів та об’єктів похідних класів. До полів та методів базового класу, оголошених як protected, можуть мати доступ тільки методи похідного класу. Об’єкти зовнішніх класів, включаючи похідний клас, в цьому випадку доступу до базового класу не мають. Класи можуть бути загальними і приватними похідними базового класу. Об’єкти загального похідного класу мають доступ до членів базового класу, оголошених як public, а об’єкти приватного похідного класу доступу до них не мають.

Клас може бути похідним більше ніж одного базового класу. Цей випадок називається множинним успадковуванням. Також клас може міститися всередині іншого класу.

Включення – це відношення типу «має» або «є частиною», при цьому один клас містить об’єкти іншого класу.

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

 

Питання по темі

1. Призначення успадковування полягає в тому, щоб:

а) створювати більш загальні класи в більш спеціалізованих

б) передавати аргументи об’єктам класів

в) додавати можливості до існуючих класів без їх модифікації

г) покращити приховування даних та їх інкапсуляцію

 

2. Перевага використання успадковування полягає в:

а) забезпеченні розвитку класу шляхом природного відбору

б) полегшення створення класу

в) повторного використання коду

 

3. Вкажіть правильний перший рядок опису класу Bosworth, який є public-похідним класу Alphsonso

а) Alphonso::Bosworth(public)

б) class Bosworth: public Alphonso

в) public class Bosworth: Alphonso

 

4. Члени базового класу для доступу до них методів похідного класу повинні бути оголошені як

а) public або protected

б) public або private

в) private або protected

 

5. Нехай базовий клас містить метод basefunc(), а похідний клас не має методу з таким іменем. чи може об’єкт похідного класу мати доступ до методу basefunc()?

а) так, завжди

б) ні

в) так, якщо цей метод не є прихованим

 

6. Чи є істинним такий вираз: якщо конструктор похідного класу не визначений, то об’єкти цього класу будуть використовувати конструктор базовго класу?

а) так

б) ні

 

7. Припустимо, що базовий і похідний класи включають в себе методи з однаковими іменами. Який з методів буде викликаний об’єктом похідного класу, якщо не використовується операція дозволу імені?

а) метод похідного класу

б) метод базового класу

 

8. Оператор дозволу звичайно:

а) обмежує видимість змінних для певних методів

б) визначає, від якого базового класу створений похідний

в) розв’язує невизначеності

 

9. Припустімо, що існує клас Derv, похідний від базового класу Base. Напишіть оголошення конструктора похідного класу, який приймає один цілий аргумент і передає його в конструктор базового класу.

а) Derv(int i):Base(i) {};

б) Derv(Base(int i));

в)Base::Derv(int i);

 

10. Припустімо, що клас Derv є приватним похідним класу Base. Ми визначаємо об’єкт класу Derv, розміщений в функції main(). Через нього ми можемо дістати доступ до:

а) членів класу Derv, оголошених як public

б) членів класу Derv, оголошених як protected

в) членів класу Derv, оголошених як private

г) членів класу Base, оголошених як public

д) членів класу Base, оголошених як protected

е) членів класу Base, оголошених як private

 

11. Чи істинне твердження: клас D може бути похідним класу С, який є похідний від класу В, для якого є базовим клас А?

а) так

б) ні

 

12. Припустімо, що клас Derv є похідним від класу Base. Обидва класи містять метод func без аргументів. Як правильно викликати метод func() базового класу з методу класу Derv?

а) func();

б) Base::func();

в) Base:func();

 

13. Як правильно описати клас С, що є похідним класів А і В?

а) class C: public A, public B;

б) class C: public A B;

в) class C::public A, public B;

 

14. Чи істинне твердження: неможливо зробити об’єкт одного класу членом іншого класу?

а) так

б) ні

 

15. Включення – це

а) форма реалізації

б) форма узагальнення

в) відношення типу «має»

 

 


Тема 12. Вказівники

 

Вступ

Адреси і вказівники

Операція одержання адреси &

Змінні вказівники

Доступ до змінної за вказівником

Вказівник на void

Вказівники і масиви

Вказівники-константи і вказівники-змінні

Вказівники і функції

Передача простої змінної

Передача масиву

Вказівники на рядки

Вказівники на рядкові константи

Рядки як аргументи функцій

Копіювання рядків з використанням вказівників

Масив вказівників на рядки

Управління пам’яттю: операції new і delete

Операція new

Операція delete

Клас String з використанням операції new

Вказівники на об’єкти

Масив вказівників на об’єкти

Зв’язний список

Класи, що містять самі себе

Вказівники на вказівники

Самостійне вивчення

Підсумок

Питання по темі

 

Вступ

Використання вказівників є характерною особливістю С++, що створює чимало труднощів, особливо для початківців. Однак саме вони надають програмуванню на С++ гнучкості.

Найчастіші приклади використання вказівників:

· Доступ до елементів масиву

· Передача аргументів в функцію, від якої вимагається змінити ці аргументи

· Передача у функцію масивів і рядкових змінних

· Створення складних структур таких як зв’язний список.

Частина далі викладеного матеріалу знайома нам з курсу предмету «Алгоритмічні мови», але такі питання, як операції new і delete, доступ до функцій класу за допомогою вказівників, масиви вказівників на об’єкти та зв’язні списки в С++, є новими.

 

Адреси і вказівники

Ідея вказівників нам вже знайома з вивчення ООП у Паскалі. Кожен байт пам’яті має адресу. Завантажуючись в пам’ять, наша програма займає якусь кількість цих адрес. Це означає, що кожна змінна і кожна функція нашої програми починається з якоїсь конкретної адреси.

 

Операція одержання адреси &

Ми можемо одержати адресу змінної, використовуючи операцію одержання адреси &. Розглянемо невеличку програму 12.1, що показує, як це зробити.

#include<iostream.h>

 #include<conio.h>

 #include<stdio.h>

 #include<bios.h>

 int main()

 {clrscr();

 int var1=11;

 int var2=22;

 int var3=33;

cout<<&var1<<endl;

cout<<&var2<<endl;

cout<<&var3<<endl;

 

 bioskey(0);

 

 return 0;

 }

Програма 12.1

 

В цій простій програмі визначені три цілочисельні змінні, ініціалізовані значеннями 11, 22 і 33. Ми виводимо на екран адреси цих змінних.

Реальні адреси, зайняті змінними в програмі, залежать від багатьох факторів таких як комп’ютер, на якому запущена програма, розмір оперативної пам’яті, наявність іншої програми та ін. Тому в різних користувачів програма 12.1 даватиме різні результати і навіть у того самого користувача при різних запусках програми результати будуть різними.

 

Змінні вказівники

Адресний простір обмежений. Можливість дізнатися, де саме в пам’яті розміщені змінні, корисна, а бачити саме значення адреси потрібно досить рідко. Зате дуже потрібними були б змінні, що зберігають адреси. Такі змінні цілковито аналогічні до змінних, які зберігають числа чи знаки. Змінна, що містить в собі значення адреси, називається змінною-вказівником чи просто вказівником.

Змінна-вказівник не того ж типу, що змінна, адресу якої вона зберігає. В програмі 12.2 показаний синтаксис змінних-вказівників.

 #include<iostream.h>

 #include<conio.h>

 #include<stdio.h>

 #include<bios.h>

 int main()

 {clrscr();

 int var1=11;

 int var2=22;

cout<<”&var1=”<<&var1<<endl;

cout<<”&var2=”<<&var2<<endl<<endl;

int* ptr;

ptr=&var1;

cout<<ptr<<endl;

ptr=&var2;

cout<<ptr<<endl;

 

 bioskey(0);

 

 return 0;

 }

Програма 12.2

В цій програмі визначені дві цілочисельні змінні var1 і var2, які ініціалізовані значеннями 11 і 22. Потім програма виводить на дисплей їх адреси.

Далі в програмі визначена змінна-вказівник в рядку

int* ptr;

Зірочка означає вказівник на. Отже, в цьому рядку визначена змінна ptr як вказівник на int, тобто ця змінна може містити в собі адресу змінної типу int. На відміну від Паскалю, в С++ не використовуються нетипізовані вказівники Pointer. Тобто, вказівник в С++ завжди вказує на якийсь конкретний тип.

Слід відмітити, що загальноприйнято визначати вказівник за допомогою зірочки, що пишеться перед іменем змінної, а не зразу після назви типу:

char *charptr;

Це не принципово для компілятора, але зірочка, розміщена відразу після назвою типу змінної, сигналізує, що це не просто тип, а вказівник на нього.

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

char* ptr1, *ptr2, *ptr3;

І в такому випадку можна використати стиль написання, при якому зірочка ставиться поруч з іменем:

char *ptr1, *ptr2, *ptr3;

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

 



Поделиться:


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

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