Лабораторная работа № 17. Наследование. Открытое и закрытое наследование. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Лабораторная работа № 17. Наследование. Открытое и закрытое наследование.



Цель работы:

овладеть практическими навыками проектирования классов иерархической структуры.

Изучить:

- организацию данных типа класс;

- приемы реализации задач с использованием классов;

- описание производных классов;

- применение построенных классов иерархической структуры для решения поставленных задач.

 

Контрольные вопросы

1. Что такое наследование класса?

2. Может ли метод класса-наследника обратиться к закрытым полям и ме­тодам своего предка?

3. Что такое полиморфизм?

4. Как в языке С++ реализуется полиморфизм?

5. Что такое виртуальный метод класса?

6. Сохраняется ли виртуальность при переопределениях метода в классах- наследниках?

7. Какие способы защиты параметра метода от его случайного изменения внутри метода вы можете предложить?

8. Может ли метод класса-наследника обратиться к закрытым полям и ме­тодам своего предка?

9. Можно ли открытый метод класса-предка переопределить закрытым ме­тодом в классе-наследнике?

10. Можно ли закрытый метод класса-предка переопределить открытым ме­тодом в классе-наследнике?

11. Какой класс называется абстрактным?

12. Какие опасности несет множественное наследование? Как их избежать?

13. Что такое виртуальный базовый класс?

 

Задания на самостоятельное выполнение

1. Множественное наследование. Базовые классы: СЛУЖАЩИЙ (атрибуты: номер социальной страховки и ФИО, функция ввода данных) и МЕНЕДЖЕР_СТАЖЕР (атрибуты: род стажера, тип программы стажера, функция ввода данных), производный класс, наследующий все атрибуты двух классов: ОПЛАЧИВАЕМЫЙ_МЕНЕДЖЕР_СТАЖЕР (собственный атрибут – оклад, вызов функций ввода двух базовых классов внутри функции ввода оклада).

2. Определить базовый виртуальный класс ЧЕЛОВЕК (имя, адрес, дата рождения, пол). Производные классы СТУДЕНТ (дополнительные подходящие сведения) и РАБОЧИЙ (дополнительные сведения). РАБОТАЮЩИЙ СТУДЕНТ - производный класс от классов СТУДЕНТ и РАБОЧИЙ. Написать программу, которая читала бы информацию из файла и создавала бы список людей. Обработать этот список для создания отсортированных по фамилиям списков всех людей, студентов, рабочих и списка рабочих студентов. Отсортировать список всех студентов, не являющихся работниками.

3. Множественное наследование с виртуальным базовым классом. Определить основной базовый класс, который содержит переменную целого типа и массив из 10 элементов типа длинное целое. Первая непосредственная база является виртуальной (в качестве базового класса выступает основная база) и содержит одну переменную типа double, вторая непосредственная база тоже виртуальная (в качестве базового класса выступает основная база) и содержит переменную типа float. Производный класс имеет символьную переменную. В главной программе вычислить размеры в байтах всех классов.

4. Задание.

1) Создать абстрактный класс Figure с методами вычисления площади и периметра, а также методом, выводящим информацию о фигуре на экран.

2) Создать производные классы: Rectangle (прямоугольник), Circle (круг), Triangle (треугольник) со своими методами вычисления площади и периметра.

3) Создать массив n фигур и вывести полную информацию о фигурах на экран.

 

5. Задание

1. Создать класс Function с методом вычисления значения функции y=f(x) в заданной точке.

2. Создать производные классы: Line (y=ax+b), Kub (y=ax2+bx+c), Hyperbola () со своими методами вычисления значения в заданной точке.

3. Создать массив n функций и вывести полную информацию о значении данных функций в точке х.

 

6. Задание

1) Создать класс Издание с методами позволяющим вывести на экран информацию об издании, а также определить является ли данное издание искомым.

2) Создать производные классы: Книга (название, фамилия автора, год издания, издательство), Статья (название, фамилия автора, название журнала, его номер и год издания), Электронный ресурс (название, фамилия автора, ссылка, аннотация) со своими методами вывода информации на экран.

3) Создать каталог (массив) из n изданий, вывести полную информацию из каталога, а также организовать поиск изданий по фамилии автора.

7. Задание

1) Создать абстрактный класс Trans с методами позволяющим вывести на экран информацию о транспортном средстве, а также определить грузоподъемность транспортного средства.

2) Создать производные классы: Легковая_машина (марка, номер, скорость, грузоподъемность), Мотоцикл (марка, номер, скорость, грузоподъемность, наличие коляски, при этом если коляска отсутствует, то грузоподъемность равна 0), Грузовик (марка, номер, скорость, грузоподъемность, наличие прицепа, при этом если есть прицеп, то грузоподъемность увеличивается в два раза) со своими методами вывода информации на экран, и определения грузоподъемности.

3) Создать базу (массив) из n машин, вывести полную информацию из базы на экран, а также организовать поиск машин, удовлетворяющих требованиям грузоподъемности.

 

8. Задание

1) Создать абстрактный класс Persona с методами, позволяющим вывести на экран информацию о персоне, а также определить ее возраст (на момент текущей даты).

2) Создать производные классы: Абитуриент (фамилия, дата рождения, факультет), Студент (фамилия, дата рождения, факультет, курс), Преподавать (фамилия, дата рождения, факультет, должность, стаж), со своими методами вывода информации на экран, и определения возраста.

3) Создать базу (массив) из n персон, вывести полную информацию из базы на экран, а также организовать поиск персон, чей возраст попадает в заданный диапазон.

 

9. Задание

1) Создать абстрактный класс Товар с методами, позволяющим вывести на экран информацию о товаре, а также определить, соответствует ли она сроку годности на текущую дату.

2) Создать производные классы: Продукт (название, цена, дата производства, срок годности), Партия (название, цена, количество шт, дата производства, срок годности), Комплект (названия, цена, перечень продуктов) со своими методами вывода информации на экран, и определения соответствия сроку годности.

3) Создать базу (массив) из n товаров, вывести полную информацию из базы на экран, а также организовать поиск просроченного товара (на момент текущей даты).

 

10. Задание

1. Создать абстрактный класс Товар с методами, позволяющими вывести на экран информацию о товаре, а также определить, соответствует ли она искомому типу.

2. Создать производные классы: Игрушка (название, цена, производитель, материал, возраст, на который рассчитана), Книга (название, автор, цена, издательство, возраст, на который рассчитана), Спорт-инвентарь (название, цена, производитель, возраст, на который рассчитана), со своими методами вывода информации на экран, и определения соответствия искомому типу.

3. Создать базу (массив) из n товаров, вывести полную информацию из базы на экран, а также организовать поиск товаров определенного типа.

11. Задание

1) Создать абстрактный класс Телефонный_справочник с методами, позволяющими вывести на экран информацию о записях в телефонном справочнике, а также определить соответствие записи критерию поиска.

2) Создать производные классы: Персона (фамилия, адрес, номер телефона), Организация (название, адрес, телефон, факс, контактное лицо), Друг (фамилия, адрес, номер телефона, дата рождения) со своими методами вывода информации на экран, и определения соответствия искомому типу.

3) Создать базу (массив) из n товаров, вывести полную информацию из базы на экран, а также организовать поиск в базе по фамилии.

12. Описать следующую иерархию классов: линейное пространство, матричное пространство, векторное, скалярное. Реализовать каждый из классов

13. Реализовать взаимосвязь виртуального телевизора и пульта дистанционного управления. Определить только основные операции, например, переключение каналов, регулирование громкости и т.п. Причем с конкретным видом телевизора должен быть связан конкретный вид пульта управления

14. Реализовать следующую систему: таймер — некоторое устройство. По сигналу таймера устройство включается, по другому сигналу — выключается. Таймер, соответственно, можно программировать на подачу этих сигналов в заданное время.

15. Реализовать модель системы обогрева теплиц (при повышении температуры выше определенного уровня включается охлаждение, при понижении - включается обогрев, температура в определённых точках теплицы измеряется датчиком температуры).

16. Создать простую почтовую систему: одна почта - много абонентов, причем почта также может быть абонентом. Абоненты могут обмениваться сообщениями только через почту.

Содержание отчета

1. Титульный лист.

2. Наименование и цель работы.

3. Краткое теоретическое описание.

4. Задание на лабораторную работу.

5. Схема алгоритма.

6. Листинг программы.

7. Результаты выполнения программы.


 

11.4. Шаблоны (На самостоятельное изучение)

Возникают случаи, когда мы хотим использовать класс, позволяющий удобно работать (например Shared Pointer, Array) сразу c несколькими типами (например BigNumber, LongString). Но тогда придётся писать отдельные реализации этих классов для каждого типа. Они будут похожи: отличие будет только в имени типа. Очевидно, что это неудобно и плохо: происходит дублирование кода; в случае, когда необходимо несколько реализаций, придётся включать несколько заголовочных файлов; может возникнуть путаница.

Шаблон класса

Понятие шаблона было введено Страуструпом для решения описанной в начале проблемы (необходимость работы с несколькими типами без дублирования кода).

template <class T>

struct Array{

T& operator [] (size_t i){

return data_[i];

}

private:

T* data_;

size_t size_;

};

Примечание: вместо class можно писать typename

Компилятор подставит вместо T формальный параметр.

Array<int> m;

Array<double> d;

Без этих строк код шаблона не будет скомпилирован и не попадёт в объектный файл. Шаблон - это декларация, в нём нет выполняемого кода.

Процесс создания класса называется инстанцированием.

Если ниже создать другой экземпляр с тем же типом:

Array<int> q;

то не возникнет повторения, это будет экземпляр того же самого класса Array<int>, т.о. шаблон - не просто подстановка.

Полное описание шаблона должно быть известно до его использования. Следовательно, нельзя разбить объявление и реализацию на.cpp и.h файлы, вся реализация должна быть известна и находиться в.h файле. Это объясняется тем, что.cpp файлы компилируются отдельно и независимо друг от друга. Это громоздко, однако в пределах одного.h файла можно сначала написать объявление, вынеся описание в конец файла:

//объявление

template <class T>

struct Array{

T& operator [] (size_t i);

private:

T* data_;

size_t size_;

};

 

//определение

template<class T>

T& Array<T>::operator [] (size_t i){

return data_[i];

}

Из эстетических соображений можно вынести определение в отдельный заголовочный файл (например “array_impl.h”) и подключить его после объявления.

Итог:

+ Шаблоны - конструкции языка, компилятор понимает, что это.

- Это довольно громоздко, реализация должна быть известна.

 

Шаблонные функции.

template<class T>

void swap(T& a, T& b){

T t(a);

a = b;

b = t;

}

 

int i=10, j=20;

swap<int>(i, j);

Примечание: в этом примере подразумевается, что для используемого типа определены конструктор копирования и оператор присваивания.

Компилятор достаточно умён чтобы самостоятельно определять тип для шаблона функции когда это возможно. Это называется deducing - вывод параметров шаблонов на основе параметров функции.

Написав просто:

swap(i, j)

компилятор попытается угадать какой тип имеют i и j и сам подставит int.

Однако:

int i = 10;

long j = 20;

swap(i, j);

вызовет ошибку, т.е. long это не и тоже самое что int. Компилятор в этом случае не может выбрать между swap<long> и swap<int>.

Если же написать:

swap<long>(i, j);

то привести int к long возможно, и код будет работать.

Шаблонные методы

template <class T>

struct Array{

template<class V>

Array<T>& operator = (Array<V> const & m);

};

 

template<class T>

template<class V>

Array<T>& Array<T>::operator = (Array const & m) { … }

//использование

Array<int> m;

Array<double> d;

d = m;

Просто запись Array внутри класса означает Array с уже подставленным параметром. Вне класса это не действует.

Ещё пример умного определения типа компилятором:

template <class T>

void sort(Array<T>& m) { … }

sort(d);

Компилятор поймёт, что в sort передан массив из double.

Пример применения двух типов для шаблона:

template <class F, class S>

struct pair{

F first;

S second;

};


 



Поделиться:


Последнее изменение этой страницы: 2016-12-11; просмотров: 744; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.141.41.187 (0.038 с.)