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 ?


 

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

39690. Поднастройка станков. Автоматическое управление точностью в процессе обработки 134 KB
  Автоматическое управление точностью в процессе обработки Для обеспечения требуемой точности обработки партии заготовок недостаточно правильно осуществить настройку станка. Под влиянием погрешностей в процессе обработки происходит смещение поля рассеивания размеров деталей к границе допуска. Задача состоит в том чтобы обеспечить необходимую точность обработки в пределах поля допуска и иметь наименьшее количество поднастроек. Для повышения точности и производительности обработки необходимо или уменьшать составляющие погрешности обработки т.
39691. Анализ точности методами математической статистики 149.5 KB
  Систематические постоянные погрешности могут быть выявлены измерением деталей после обработки и их влияние может быть уменьшено технологическими мерами. Кривые распределения и оценка точности на их основе Статистический метод оценки точности применяется в условиях производства большого количества деталей. Для его применения необходимо произвести выборку деталей из обрабатываемых на исследуемой операции. По результатам измерения деталей выборки строится опытная кривая распределения к которой по критерию согласия подбирается теоретический...
39692. Вибрации при механической обработке 55 KB
  Наибольшее влияние на процессы резания оказывают вынужденные колебания и автоколебания. В отличие от вынужденных колебаний автоколебания начинаются одновременно с началом процесса резания и прекращаются с его окончанием. Причиной возникновения автоколебаний является сам процесс резания Переменная сила поддерживающая колебания создается и управляется процессом резания и при его прекращении исчезает. Автоколебания возникают в связи с непостоянством сил резания вследствие изменения сил трения стружки по передней поверхности режущего...
39693. Особенности проектирования технологических процессов механической обработки для ГПС без использования ПР 39 KB
  Заготовки устанавливаются и закрепляются в приспособлениях которые в виде различных наладок монтируются на палетах. Наладчик комплектует наладку и устанавливает заготовки в соответствии со схемой установки транслируемой системой управления ГПС на экран терминала участка комплектации. Наиболее приемлемы три варианта обработки: сохранение на окончательно обработанной заготовке одной необработанной поверхности для базирования закрепления и обработки заготовок за один установ; предварительная обработка вне ГПС на участке подготовки баз...
39694. Точность и надежность обработки заготовок в ГПС 43.5 KB
  На основании оценки надежности технологических систем производится: оптимизация технологических маршрутов операций и режимов обработки; выбор средств технологического оснащения; установление периодичности замены режущего инструмента; установление такта выпуска изделий. При ужесточении этих требований например для квалитетов IT5 и IT6 возрастает роль составляющих погрешностей обработки обусловленных ошибками начальной настройки инструмента его износа тепловыми деформациями технологической системы ошибками установки инструмента...
39695. ТЕХНОЛОГИЯ ПРОИЗВОДСТВА ДЕТАЛЕЙ МАШИН В ГИБКИХ ПРОИЗВОДСТВЕННЫХ СИСТЕМАХ 111.5 KB
  Опыт внедрения гибких автоматизированных систем в механообработке показывает возможность снижения трудоемкости обработки заготовок в несколько раз; сокращения обслуживающего персонала; увеличения выпуска продукции за счет повышения загрузки оборудования сокращения сроков и стоимости подготовки производства. К основным преимуществам гибких производственных систем механообработки относится: резкое увеличение производительности труда в процессе изготовления единичной и мелкосерийной продукции; быстрое реагирование на изменение требований...
39696. Особенности проектирования технологических процессов для ГПС 114 KB
  Дальнейший анализ заготовок обработка которых предполагается в ГПС производится в следующей последовательности: анализ возможности унификации конструктивных элементов и параметров деталей подготовка предложений по отработке конструкций на технологичность; анализ возможности получения заготовок более прогрессивными методами формообразования в целях уменьшения трудоемкости механообработки расхода материалов улучшения качества изделий и подготовка предложений по переводу технологии на прогрессивные методы получения заготовок; ...
39697. Технология изготовления деталей машин 147 KB
  Технологическая база поверхности центровых отверстий или наружные цилиндрические поверхности вала. Технологическая база наружная поверхность и торец прутка. Технологическая база – отверстие на оправке. Технологическая база черная поверхность обода или ступицы и торец Выполняется в зависимости от конструкции и типа производства на токарном револьверном или карусельном станке.
39698. ТЕХНОЛОГИЯ СБОРКИ ИЗДЕЛИЙ И ИЗГОТОВЛЕНИЯ ДЕТАЛЕЙ 414.5 KB
  Значение сборки при изготовлении машин Сборка является заключительным этапом изготовления машин и в значительной степени определяет ее эксплуатационные качества. Одни и те же детали соединенные при разных условиях сборки могут значительно изменять долговечность их службы. Технологические процессы изготовления деталей в большинстве случаев подчинены технологии сборки машины.