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

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

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

Добавлен: 13.09.2024

Просмотров: 21

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