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 ?


 

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

27585. Заведомо ложные показание, заключение эксперта или неправильный перевод (ст. 307 УК). Заведомо ложный донос (ст. 306 УК) и его отличие от клеветы (ст. 129 УК) 30.5 KB
  Объективная сторона данного преступления выражается в том что названные в ч. Комментируемое деяние становится квалифицированным если оно соединено с обвинением лица в совершении тяжкого или особо тяжкого преступления. Круг субъектов данного преступления определен в самой норме это свидетель потерпевший эксперт специалист и переводчик. Подозреваемый обвиняемый и подсудимый не могут быть привлечены к ответственности Субъективная сторона этого преступления характеризуется только прямым умыслом.
27587. Задачи и функции (охранительная и регулятивная) уголовного права. Принципы уголовного права 29 KB
  Задачи и функции охранительная и регулятивная уголовного права. Принципы уголовного права. Задачи уголовного права сформулированы в ст. Задачи уголовного права реализуются в процессе осуществления основных функций данной отрасли законодательства 1 Предупредительная регулятивная функция заключается в установлении наказания тем самым предупреждая граждан об ответственности в случае совершения преступления.
27589. Задержание лица, совершившего преступление. Основания для задержания и условия правомерности действий по его задержанию. Отличие причинения вреда при задержании преступника от необходимой обороны 29 KB
  Задержание лица совершившего преступление. В соответствии с законом не является преступлением причинение вреда лицу совершившему преступление при его задержании для доставления органам власти и пресечения возможности совершения им новых преступлений если иными средствами задержать такое лицо не представилось возможным и при этом причиненный вред не превысил пределов необходимости. 91 УПК РФ: 1 если лицо застигнуто при совершении преступления или непосредственно после его совершения; 2 потерпевшие или очевидцы укажут на данное лицо как...
27591. Законодательное определение и критерии невменяемости. Уголовная ответственность лиц с психическими расстройствами, не исключающими вменяемости (ограниченная вменяемость) 34.5 KB
  Лицо находящееся в состоянии невменяемости не подлежит уголовной ответственности и не является субъектом преступления ст. Состояние невменяемости устанавливается заключением судебнопсихиатрической экспертизы. Юридический психологический критерий невменяемости имеет два признака: интеллектуальный признак т.
27593. Захват заложника 32.5 KB
  Захват заложника ст. Объективная сторона заключается в захвате или удержании лица в качестве заложника. Захват заложника – это открытое либо тайное с применением насилия или угрозы его применения либо без такового ограничение свободы его передвижения которое сопровождается в последующем открытым сообщением об этом и выдвигаемых условиях его освобождения.