Файл: 17_наследование у.doc

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 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. Створити чергу і дек з використанням успадкування класів. Організувати роботу з елементами списку.