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 ?


 

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

24722. Сознание 44 KB
  Задачи: определение понятия сознание функции сознания слои сознания по Зинченко В. психические состояния человека состояния сознания. Ключевые понятия: понятие сознание слои сознания функции сознания психические состояния человека: определение измерения характеристики виды; состояния сознания. Слои сознания по Зинченко В.
24723. Я-ОБРАЗ 52.5 KB
  Общение с собой: Начало психологии активности. Основы общей психологии. Элементы практической психологии.
24725. Предметная область психологии 71.5 KB
  занятие контрольнодиагностические задания Цели: теоретическое и практическое овладение знаниями знакомство с наукой психология связь психологии с другими науками Ключевые понятия: психология как наука предмет психологии задачи психологии. Методология и методы психологии: методология наука о методах. психологии харакны след принципы: В основе лежат постулаты диалектического материализма Принцип развития психика непрерывно изменяющ.
24726. Человек как предмет общей психологии 35.5 KB
  Предложите и обоснуйте проект проведения лекции по теме Человек как предмет общей психологии Тема: человек как предмет общей психологии лекция. Цель: человек как предмет общей психологии. Ключевые понятия: объект психологии; предмет психологии; модельное описание психического облика человека: лингвистическая картина психического облика человека описание состава человеческой души: Аристотель Платон Плотин; ингредиенты психического облика; психика. Основные тезисы и краткое их доказательство: Первым и важнейшим объектом психологии...
24727. ТЕМПЕРАМЕНТ 43.5 KB
  Адресат: студенты 1го курса психологического факультета Цели: знакомство студентов с понятием темперамент раскрытие этого понятия через его определение и свойства с помощью темперамента показать психологические личностные различия. Задачи: определение темперамента история представлений о темпераменте свойства темперамента. Ключевые понятия: темперт темпераментные свойства типы ВНД типы темпта.
24728. Личность 41 KB
  Задачи: определение подходов к пониманию личности понятия личность подходов выявляющих ядро личности закономерностей развития личности направления исследования личности. Ключевые понятия: личность; система смыслов черт планов отношений; индивид субъект деятельности индивидуальность; биологическое и социальное социализация личности. и краткое их доказательство: В психологии имеются разные подходы к пониманию личности: она м. Подходы выявляющие ядро личности можно систематизировать след.
24729. Тромбоцитопеническая пурпура 140 KB
  Заболевание начинается исподволь или остро с появления геморрагического синдрома: кровоизлияния в кожу или слизистые оболочки и кровотечения из них. Для ТП характерны кровотечения из слизистых оболочек. Наиболее часто у детей наблюдаются кровотечения из носа маточные кровотечения у девочек в пубертатном возрасте. Реже бывают желудочнокишечные и почечные кровотечения.
24730. Патология периода новорожденности 127 KB
  Слайд 2 Последствия перенесенной энцефалопатии в периоде новорожденности нарушения психики церебральные параличи эпилепсия другие заболевания головного мозга. Некоторые дети перенесшие внутричерепную травму остаются с нарушениями психики с церебральными параличами с эпилепсией и другими заболеваниями головного мозга. Механизм развития патологического процесса при внутричерепной травме новорожденных можно представит в виде следующей схемы: Слайд 4 Схема развития патологического процесса при повреждении нервной системы...