17123

Використання спадкування для створення ієрархії класів

Лабораторная работа

Информатика, кибернетика и программирование

Лабораторна робота № 32 Тема: Використання спадкування для створення ієрархії класів Ціль роботи: одержати навички у використанні спадкування для створення похідних класів при простому спадкуванні. Обладнання: ПКПО Borland C Теоретичні відомості При оголошенні п...

Украинкский

2013-06-29

80.5 KB

2 чел.

Лабораторна робота № 32

Тема: Використання спадкування для створення ієрархії класів

Ціль роботи: одержати навички у використанні спадкування для створення похідних класів при простому спадкуванні.

Обладнання: ПК,ПО Borland C++

Теоретичні відомості

При оголошенні похідного класу D перелічуються базові класи В1, У2 ... у поділюваному комі "базовому_списку". Синтаксис оголошення похідного класу.

сlass <Ім'я_класу_D>:<Базові_класи> {<список_елементів>};

При оголошенні класу D перед класами в базовому списку ви можете задати специфікатор доступу public, чи private, чи protected.

class D : public B1, private B2, ... {

...

};

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

Якщо D являє собою оголошення класу (class), то за замовчуванням використовується private, а якщо D - оголошення структури (struct), те public.

Клас D успадковує всі елементи базових класів. (Перевизначені елементи базових класів успадковуються і при необхідності доступ до них можливий за допомогою перевизначень області дії). D може використовувати елементи базових класів тільки з атрибутами public і protected.

Похідний клас успадковує атрибути доступу базового класу в такий спосіб:

1.Якщо базовий клас зазначений у списку як public:

елементи public базового класу стають елементами public похідного класу.

елементи protected базового класу стають елементами protected похідного класу.

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

2. Якщо базовий клас protected:

елементи базового класу загальнодоступні (public) і захищені (protected) стають захищеними (protected) елементами похідного класу.

елементи private базового класу залишаються для довільного класу private.

3. Якщо базовий клас private:

загальнодоступні (public) і захищені (protected) члени базового класу стають частками (private) елементами похідного класу.

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

В усіх розглянутих випадках відзначимо, що елементи private базового класу були і залишаються недоступними для функцій-членів похідного класу, поки в похідному класі не використаний оператор дозволу області видимості (::), поки в описі доступу базового класу не будуть явно задані оголошення friend. Наприклад:

class X : A {  // клас X є похідним від класу А (простої

// спадкування), причому за замовчуванням специфікатор - private A

}

class Y : B, public C {  // клас Y є похідним (множинне

// спадкування) від B і C. За замовчуванням - private B, специфікатор для С- public

}

struct S : D {   // struct S - похідна від D, за замовчуванням для структур

 // struct  - public D

..,

}

struct T : private D, E {  // struct T є похідної (множинне 

 // спадкування) від  D і E. Специфікатор для D – private D. За замовчуванням,

// E  - public E

}

Дія специфікаторів доступу до елементів базових класів при спадкуванні можна скорегувати за допомогою оператора дозволу області видимості (::) у розділах public чи protected для похідного класу. Наприклад:

class B {// базовий клас

int a;   // за замовчуванням

 // private

public:

int b, c;

int Bfunc(void);

};

class X : private B {   // тепер члени базового класу // У::a, b, c і B func() - стали private у класі //спадкоємці Х. Перемінна а в Х недоступна

int d;      // за замовчуванням private

public:

B::c;       // перемінна c була private; тепер вона public:

int e;

int Xfunc(void);

};

int Efunc(X& x);       // зовнішня стосовно класів В и Х, вимагає

// посилання на об'єкт х класу Х.

Функція Efunc() може використовувати тільки імена членів класу Х с атрибутом public, наприклад х.c, х.e і х.Xfunc.

Функція Xfunc() у X є функцією-членом, тому вона має доступ:

до власних private і public елементам: d, e і Xfunc().

до старших private елементам базового класу В: b і Bfunc().

Однак, Xfunc не має  доступу  до  private відносно B елемента a.

до перемінного з класу В явно заданої public c допомогою (::) – У::с.

Конструктори базового класу повинні з'являтися з атрибутами public чи protected. Причому: конструктори похідних класів обов'язково викликають конструктори базових класів.

Приклади:

class base1

{

int x;

public:

base1(int i) { x = i; }

};

class base2

{

int x;

public:

base2(int i) : x(i) {}

};

class top : public base1, public base2

{

int a, b;

public:

top(int i, int j) : base(i*5), base2(j+i), a(i) { b = j;}

};

У випадку такої ієрархії класів оголошення top one(1, 2) приведе до ініціалізації base1 ::х значенням 5, а base2 ::х значенням 3. Методи ініціалізації можуть комбінуватися один з одним (чергуватися).

Базові класи ініціалізуються нижнього з верхнього в ієрархії в послідовності, зазначеної в оголошенні похідного класу при множинному спадкуванні. Ініціалізація елементів відбувається в послідовності їхнього оголошення незалежно від послідовності їхнього розташування в списку ініціалізації.

class X

{

int a, b;

public:

X(int i, j) : a(i), b(a+j) {}

};

Оголошення X xobj (2.1) приведе до присвоювання xobj::a числа 2 і xobj::b числа 3.

Конструктори базових класів викликаються перед конструюванням  будь-яких елементів похідних класів. Значення дан-членів похідного класу не можуть змінюватися і потім впливати на створення базового класу.

class base

{

int x;

public:

base(int i) : x(i) {}

};

class derived : base

{

int a;

public:

derived(int i) : a(i*10), base(a) {} // не можна, тому що

// конструктору base буде передане неініційоване a

}

При зовнішнім визначенні конструктора derived він також викликає конструктор базового класу

derived::derived(int i) : base(i)

{

...

}

"Друзі" класів (friend)

Якщо в чи оголошенні визначенні функції в межах класу Х використовується специфікатор friend,  то така функція стає "другом" класу Х.

"Друг" F класу X - це чи функція клас, що, не будучи функцією-елементом Х, має право доступу до елементів Х, включаючи розділи private і protected. В всіх інших відносинах F() - це звичайна з погляду області дії, оголошення і визначення функція.

Оскільки функція F() не є елементом Х, вона не лежить в області дії Х и тому для Х хobj, *xptr; не може викликатися операціями вибору xobj. F() і xptr->F (де xobj - це об'єкт класу Х, а xptr - це покажчик на клас Х).

Дружня функція, визначена в межах класу (inline), підкоряється тим же правилам убудовування, що й елемент^-функції-елементи класу. На дружні функції не діють специфікатори доступу. Наприклад:

Оголошення класу

Визначення для функцій

class X {

int i;                // private

friend void friend_func(X*, int);
// friend_func
не є private,

// хоча вона й оголошена в розділі

// private

public:

void member_func(int);

};

void friend_func(X* xptr, int a) { xptr->i = a; }  // доступ до private int i відкритий

void X::member_func(int a) { i = a; }

// у функцію-член не потрібно

// передавати чи покажчик посилання на

// клас, тому що доступ до неї

// здійснюється через об'єкт класу

// операцією вибору (.)

X xobj;  // оголошення об'єкта xobj класу Х

Відзначимо розходження у викликах функцій:

friend_func(&xobj, 6);  // виклик без імені об'єкта як звичайна функція

xobj.member_func(6);  // виклик з ім'ям об'єкта класу

Можна зробити усі функції класу Y дружніми для класу Х в одному оголошенні:

class Y; // неповне оголошення

class X {

friend Y; // клас Y є

// дружнім для Х

int i;

void member_funcX();

};

class Y; { friend void X::member_funcX();

public:

void fr_X1(X&);

void fr_X2(X*);

...

};

Функції fr_x1() і fr_x2(), оголошені в Y, є дружніми для Х, хоча вони і не мають специфікаторів friend. Вони мають доступ до приватних елементів Х (private), таким як i і member_func(). Крім того, окремі член^-функції-члени класу Х також можуть бути дружніми для класу Y.

"Дружність" класів не транзитивна: якщо X є дружнім для Y, а Y - дружній для Z, це не означає, що X - дружній Z. Однак, "дружність" успадковується.

Приклад програми на С++

Базовий клас

Похідний клас

Похідний клас

транспортний засіб

літак

Дельтаплан

#include<iostream.h>

class Transp{

public:

 int dlin,mass;

 char *im;

};

class samolyo:public Transp{

public:

 samolyo();

 ~samolyo();

};

samolyo::samolyo()

{im=new char[10];

im="Samolyot";

}

samolyo::~samolyo()

{delete[]im;

}

class deltapl:public Transp{

public:

 deltapl();

 ~deltapl();

};

deltapl::deltapl()

{im=new char[10];

im="Deltaplan";

}

deltapl::~deltapl()

{delete[]im;

}

void main()

{samolyo s1;

deltapl d1;

cout<<"Vvadite dlinu i massu transportnogo sryedstva \n";

cout<<"samolyot: \n";

cin>>s1.dlin>>s1.mass;

cout<<"deltaplan: \n";

cin>>d1.dlin>>d1.mass;

cout<<"____________________\n";

cout<<s1.im<<"\ndlina: "<<s1.dlin<<" massa: "<<s1.mass<<'\n';

cout<<d1.im<<"\ndlina: "<<d1.dlin<<" massa: "<<d1.mass;

}

Хід роботи

1.Вивчити теоретичні відомості.

2.Відповідно до індивідуального завдання, розробити структуру базового класу і спадкоємців (не менш 3-х похідних класів на двох рівнях ієрархії). Використовувати конструктори і деструктори для ініціалізації даних і знищення об'єктів класів. Використовувати член^-функції-члени, що заміщають, для роботи з об'єктами класів.

3.Розробити алгоритм рішення задачі і програму.

4.Набрати програму на комп'ютері й усунути помилки.

4.Одержати результат.

5.Оформити звіт.

6.Підготуватися до захисту лабораторної роботи, вивчивши контрольні питання по даній темі.

Вимоги до змісту звіту приведені в лабораторній   роботі   №1.

Індивідуальне завдання

Скласти програму за індивідуальним завдання.

Таблиця 22.1 - Варіанти понять для базових класів

Варіант

Поняття

Варіант

Поняття

1

Рослини

15

Меблі

2

Тварини

16

Будівлі

3

Небесні тіла

17

Мости

4

Спортивні змагання

18

Бритви

5

Друкована продукція

19

Принтери

6

Промислове виробництво

20

Плоттеры

7

Телефони

21

Рознімання електричні

8

Залізнично-транспортні засоби

22

Маніпулятори для введення інформації

9

Автомобільний транспорт

23

Пристрою запису інформації

10

Освітлювальні прилади

24

Сканери

11

Засобу зв'язку

25

ЕОМ

12

Телевізори

26

Нагрівальні пристрої

13

Кораблі

27

Пристрою передачі моменту, що крутить

14

Меблі м'яка

28

Контрольні питання

1.Що означає оператор (::)?

2.Що означає поняття спадкування?

3.Який клас називається базовим?

4.Який клас є спадкоємцем?

5.Скільки базових класів може бути в похідного класу?

6.Може похідний клас бути базовим?

7.Чи можна задавати специфікатори для базових класів при спадкуванні (оголошення довільного класу)?

8.Як змінюється доступ до елементів базового класу при спадкуванні з різними специфікаторами доступу: з розділів класу, із програми, з інших класів?

9.У чому різниця між простим і множинним спадкуванням?

10.Що означає вираження  «неповне оголошення» класу?

11.Чи можна уточнити доступ до членів базового класу в похідному класі? Як це здійснюється?

12.Які функції називаються друзями класу?

13.Як з'являються і визначаються функції-друзі класу?

 14.Чи може клас бути дружнім?

 16.Чи можуть два класи бути друзями один одному?

 17.Чи можна з класу-спадкоємця одержати доступ до private частини базового класу, якщо специфікатор доступу при спадкуванні private ?


 

А также другие работы, которые могут Вас заинтересовать

9801. Учет риска при инвестировании капитальных вложений 86 KB
  Учет риска при инвестировании капитальных вложений. В условиях рыночной экономики, особенно в период ее становления, инвестирование развития сопряжено с риском неполучения ожидаемых результатов в установленные (желаемые) сроки. В связи с этим возник...
9802. Система критериев принятия рискового решения 133.5 KB
  Система критериев принятия рискового решения. Принятие рискового решения на ведение конкретной операции (сделки) в предпринимательской деятельности является заключительной процедурой на стадии анализа риска в технологии риск-менеджмента. Объективная...
9803. Критерии принятия решения в условиях определенности 77.5 KB
  Критерии принятия решения в условиях определенности. В условиях определенности неблагоприятные последствия рисковой ситуации однозначно и адекватно оцениваются значениями показателей риска. В данном случае используются детерминированные модели и мет...
9804. Критерии принятия решения в условиях стохастической неопределенности 32 KB
  Критерии принятия решения в условиях стохастической неопределенности. В условиях стохастической (частичной) неопределенности (риска) исходы предполагаемого результата деятельности имеют вероятностный характер и взаимосвязи между критериями и показат...
9805. Критерии принятия решения в условиях нестохастической неопределенности 24 KB
  Критерии принятия решения в условиях нестохастической неопределенности. В условиях неопределенности нестохастической природы значения ожидаемого результата не могут быть описаны в рамках вероятностных моделей. Между критериями и оценками риска сущес...
9806. Эвристические правила принятия рискового решения 113 KB
  Эвристические правила принятия рискового решения. В случаях когда риск рассчитать невозможно, принятие рисковых решений основывается на эвристике, представляющей собой совокупность логических приемов и методических правил отыскания истины. Рис...
9807. Факторы внешней среды в риск-менеджменте предприятия 34.5 KB
  Факторы внешней среды в риск-менеджменте предприятия. Факторы внешнего окружения предприятия формируют совокупность сред экономической, политической, правовой, социально-культурной, технологической, географической, институциональной. Каждая из них ...
9808. Среда прямого и косвенного воздействия на предпринимательскую структуру 67.5 KB
  Среда прямого и косвенного воздействия на предпринимательскую структуру. С целью конкретизации выбора стратегии развития, а значит и уменьшения риска допустить ошибку при прогнозировании и планировании своей деятельности, менеджеры предприятий оцени...
9809. Определяющие факторы внутренней среды в рискованной деятельности предприятия 32 KB
  Определяющие факторы внутренней среды в рискованной деятельности предприятия. Внутреннюю среду субъекта хозяйствования определяют факторы, которые требуют особого внимания в менеджменте риска. Это, во-первых, кадровый состав предприятия, его потенци...