ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 14.09.2024
Просмотров: 13
Скачиваний: 0
Лабораторна робота № 17
Тема: Програмування з використанням успадкування класів
Мета роботи:
1 ) вивчити можливість успадкування класів на мові С + + ;
2 ) отримати основні навички програмування з використанням успадкування класів.
Теоретичні відомості
Клас може успадковувати характеристики і поведінку одного або декількох базових класів, привносячи нові властивості. Перед тим, як проектувати новий клас, треба визначити, якими найбільш загальними рисами повинні володіти його об'єкти, і з'ясувати, чи немає вже готового схожого класу. Далі, від загального плану класу, поступово деталізуючи його, будувати новий.
Основна форма успадкування:
class ім’я_ наслідуваного _класу : режим_доступу успадковуєючий_клас.. ;
У мові C + + прийнято називати наслідуваний клас базовим класом, успадковуєючий клас - похідним класом. Режім_доступа - це одне з ключових слів private, public або protected. Опція public означає, що всі елементи типу public предка будуть типу public для класу, який наследує його. Загальні ( public ) елементи можуть бути доступні іншим функцій програми. Приватний ( private ) елементи недоступні для похідного класу, а доступні тільки функціям - членам класу або дружнім ( friend ) функціям. Захищені ( protected ) елементи також можуть бути доступні тільки функціям - членам класу або дружнім функціям.
наприклад:
class X / / Базовий клас X
{ Int i ;
int j ;
public :
void get_f ( void ) ;
void put_f ( void ) ;
} ;
class Y : public X / / Похідний клас Y
{ Int m ;
public :
int get_m ( void ) ;
void make_m ( void ) ;
} ;
Тут Х - базовий клас, Y - похідний клас. Функції- члени класу Y можуть використовувати загальні функції get_f ( ) і put_f ( ), але вони не можуть використовувати i і j, так як вони приватні для Х і, відповідно, недоступні для функцій get_m ( ), put_m ( ) класу Y.
Можна забезпечити доступ членів - функцій класу Y до елементів i та j класу Х. Для цього в класі Х треба оголосити їх захищеними - protected :
class X
{ Protected :
int i ;
int j ;
public :
Void get_f ( void ) ;
void put_f ( void ) ;
} ;
class Y : public X
{ Int m ;
public :
Int get_m ( void ) ;
void make_m ( void ) ;
} ;
Тепер члени класу Y мають доступ до членів i, j класу Х. Водночас i, j залишаються недоступними для іншої частини програми. Доступ успадковується до елементів, оголошеним захищеними або загальними, але не успадковується для приватних елементів.
Приклад. Нехай вже є такі класи як NAME (містить дані про ім'я людини) і JOB (членами-даними якого є місце роботи людини і його посада) і необхідно створити клас, що містить більш повну інформацію про співробітника деякої компанії, то крім перерахованої інформації потрібно включити вік і стать. Очевидно, зручно новий клас PERSON зробити спадкоємцем вже наявних класів NAME і JOB.
Приклад: Створимо клас «студент» і клас-спадкоємець «викладач».
class Student // Опис класів
{ protected:
char name[50]; // ПІБ
int age; // вік
char sex[50]; // стать
public: Student(char n[],int a,char s[]);
public: void about(void); // Функція виведення інформації
};
class Teach: public Student
{ char subject[50]; // предмет, що викладається
public: Teach (char n[50],int a,char s[50],char su[50]);
public: void about(void);
};
//-------- звична частина програми -------
#include<stdio.h>
#include<conio.h>
#include<string.h>
//--------------class Student---------------------- // реалізація функцій класів
Student::Student(char n[50],int a,char s[50])
{ strcpy(name,n); age=a; strcpy(sex,s);}
void Student::about(void) // функція виведення інформації
{ gotoxy(10,4); printf("ФИО : %s",name);
gotoxy(10,6); printf("Возраст : %d",age);
gotoxy(10,8); printf("Пол : %s",sex);}
//-----------------class Teach--------------( спадкоємець Student'a)
Teach::Teach(char n[50],int a,char s[50],char su[50]): Student(n,a,s) // використовуємо клаcc Student
{ strcpy(subject,su); } // і додаємо новий член -subject
Void Teach::about(void)
{ Student::about();
gotoxy(10,10);printf("предмет, що викладається : %s",subject);
}
//---------------- основна програма ------------------------
Void main()
{
Student *stud;
Teach *teacher;
clrscr();
gotoxy(26,1);
cprintf("Студент :");
stud = new Student("Петров Петро Петрович ",17,"чол.");
stud ->about();
delete stud;
gotoxy(25,24);
cprintf("Натисніть же що-небудь!");
getch();
clrscr();
gotoxy(25,1);
cprintf("Преподаватель :");
teacher = new Teach("Василь Іванович Кугук ",45,"чол."," плавання ");
teacher ->about();
delete teacher;
gotoxy(25,24);
cprintf("Натисніть будь-яку клавішу для виходу ");
getch();
}
Успадкування дозволяє передавати всі визначені користувачем властивості класу декількох класах, успадковується даний клас. Проілюструємо передачу режиму доступу до змінних при спадкуванні типу X–>Y–>z.
#include<iostream.h>
class X
{
protected:
int i;
int j;
public:
void get_f(void);
void put_f(void);
};
class Y: public X // i, j класу Х стали protected членами у класі Y
{ int m;
public:
int get_m(void);
void make_m(void);
};
class Z: public Y // Z має доступ до змінних i, j класу Х
{ public: // Z не має доступу к m класу Y
void d(void);
};
void X:: get_f(void)
{ cout << " Введіть два числа:" << "\n";
cin>>i>>j;}
void X::put_f(void)
{ cout << "i=" << i << "j=" << j << "\n";}
int Y::get_m(void)
{ return m;}
void Y::make_m(void)
{ m = i*j; }
void Z::d(void)
{ i = 5; j = 4;}
void main()
{
Y a;
Z b;
a.get_f();
a.put_f();
a.make_m();
cout << a.get_m() << "\n";
b.d();
b.put_f();
b.make_m();
cout << b.get_m() << "\n";
}
Якщо ми замінимо режим доступу при спадкуванні класу Х на private, то функція void Z :: d ( void ) не матиме право доступу до змінних i, j.
Якщо ж ми замінимо режим доступу при спадкуванні класу Z на private, не змінюючи режим доступу при спадкуванні класу Х, то дія прикладу в порівнянні з початковим не зміниться.
Базові класи створюються в тому порядку, в якому вони перераховані в списку базових класів при оголошенні похідного класу Z.
Використання конструкторів при спадкуванні має свої особливості. Поки конструктори базового класів не мають аргументів, то похідний клас може не мати функцію - конструктор. Якщо ж конструктор базового класу має один або кілька аргументів, кожен похідний клас зобов'язаний мати конструктор. Щоб передати аргументи на базовий клас, потрібно визначити їх після оголошення конструктора базового класу.
У завданні на програмування потрібно визначити класи і побудувати для них ієрархію, а також продемонструвати використання введених конструкції при роботі.
Варіанти завдання до лабораторної роботи 17
1. Створити клас-батько «крапка», його спадкоємця - клас «коло», і спадкоємця клас «коло» клас «коло з текстом всередині» (намалювати, стерти, пересунути, змінити радіус).
2. Створити клас-батько « точка », його спадкоємця - клас « відрізок », спадкоємця опуклого відрізка « чотирикутник » ( намалювати, стерти, зафарбувати, пересунути, повернути ).
3. Створити клас-батько « точка », його спадкоємця - клас « відрізок », спадкоємців відрізка «квадрат», « паралелограм » ( намалювати, стерти, зафарбувати, пересунути, повернути ).
4. Створити клас «меню » і його спадкоємців - горизонтальне, вертикальне, ієрархічне (додати пункт, намалювати ).
5. Створити клас « студент » і його клас - спадкоємець «група студентів» ( вивести, змінити, впорядкувати інформацію).
6. Створити клас-батько «телефон » і його клас - спадкоємець «адреса » ( вивести, змінити).
7. Створити клас-батько « спортсмен » і клас - спадкоємець «команда спортсменами -нів » ( вивести окремо П.І.Б., вид спорту, вік, вага; змінити інформацію).
8. Створити клас-батько « точка », його спадкоємця - клас « відрізок », наслед -ників відрізка - « ромб », «трикутник» ( намалювати, стерти, зафарбувати, повернути ).
9. Створити клас-батько «рядок » і клас-батько «вікно» ; з цих двох класів отримати вікно з рядком ( вивести на екран, змінити рядок, розміри вікна).
10. Створити клас-батько «учень», клас - спадкоємець «учень і його оцінки» ( з деяких предметів ), і клас - спадкоємець « журнал».
11. Організувати програму здійснює ієрархію породження одного клас ¬ са з базового, по типу «комп'ютер», → « периферійний пристрій », → « кла ¬ Віатур ».
12. Розробити програму множинного успадкування. Дано вихідні класи « школа » і «університет», породити клас « навчальні заклади», в якому є основні функції вихідних.
13. Розробити програму здійснює ієрархію породження декількох класів з базового, по типу «пристрій», → « монітор», → « клавіатура », → «миша ».
14. Мається base class (A ), в якому одна з функцій приймає числа з вхідного потоку, створити derive class (B), в якому одна з функцій роздруковує їх по зростанню, а інша знайде їх суму.
15. Розробити програму « картотека », з використанням наслідування від одного базового класу. Мається клас « книга », породити класи « дані авто ¬ ра », « індекс книги » і організувати доступ між класами.
16. Створити клас-батько « вектор» і клас - спадкоємець «векторна фігура» (намалювати, стерти, зафарбувати, пересунути, повернути ).
17. Створити клас-батько «бінарне дерево» і його клас - спадкоємець «n - арне дерево». Передбачити запис нових елементів і висновок дерев на екран.
18. Створити клас-батько «односпрямований список» і його клас - нащадок «двонаправлений список». Створити функції додавання нових елементів і виведення на екран всіх елементів списку з адресами попереднього і наступного елементів (для двонаправленого списку).
19. Створити клас-батько « стек » і клас - спадкоємець « грудня ». Передбачити функцію додавання елементів і функцію виведення на екран елементів.
20. Створити чергу і дек з використанням успадкування класів. Організувати роботу з елементами списку.