Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Лабораторная работа №15.
Тема: Использование свойства полиморфизма и исследование механизма виртуальных функций.
Цель: Научиться переопределять виртуальные методы в производных классах.
Оснащение: IBM PC, Borland C++ 5.02
Виртуальным методом называется метод, который необходимо переопределять в производных классах.
Пример объявления виртуального метода:
virtual int TestMethod()
{
doSomething(); //Что-то сделать
return 0;
}
Чисто виртуальным методом называется метод, реализация которого возможна ТОЛЬКО в производных классах.
Пример объявления чисто виртуального метода:
virtual int TestMethod() = 0;
Класс, содержащий хотя бы один чисто виртуальный метод, называется абстрактным. Абстрактные классы предназначены для представления общих понятий, которые предполагается конкретизировать в производных классах. Абстрактный класс может использоваться только в качестве базового для других классов объекты абстрактного класса создавать нельзя, поскольку прямой или косвенный вызов чисто виртуального метода приводит к ошибке при выполнении.
Допускается объявлять указатели на абстрактный класс. Свойство полиморфизма означает, что указатель на базовый класс может ссылаться на объект производного класса.
Например, в случае следующей иерархии классов:
где Item абстрактный класс, описывающий предмет в библиотеке, Book производный класс, описывает книгу, Magazine производный класс, описывает журнал, следующий фрагмент кода является компилируемым:
Item *item1 = new Book();
Item *item2 = new Magazine();
item2->Show();
item3->Show();
Здесь обявляется 2 указателя на абстрактный класс, которые ссылаются на обекты классов Book и Magazine. Метод Show() вызывается косвенно для каждого обекта в терминах базового класса, но работает по-разному, в зависимости от реализации в классах Book и Magazine. Например, для класса Book метод Show() может выводить информацию об авторе книги и коде издания, для класса Magazine() информацию о номере журнала и издательстве.
Если класс, производный от абстрактного, не реализует все чисто виртуальные методы, он тоже является абстрактным.
Конструкторы не наследуются, но существует возможность вызывать в производных классах конструкторы базовых. Пример конструктора базового класса Item:
Item(int _invN, string _name)
{
this->invN = _invN; //инициализация инв номера
this->name = _name; //инициализация имени
this->taken = false; //предмет изначально не взят
}
Пример конструктора класса Book с четырьмя параметрами с вызовом базового конструктора:
Book(int _invN, string _name, string _author, int _year) : Item(_invN, _name)
{
this->author = _author; //инициализация автора
this->year = _year; //инициализация года
}
Часть строки «:Item(_invN) » означает, что вызывается конструктор
Item(int, string) базового класса, который инициализирует инвентарный номер и название объекта. Поскольку в базовом классе существует конструктор, инициализирующий инвентарный номер и название предмета, реализовывать то же самое в производных классах нет нужды, достаточно лишь вызвать конструктор базового класса.
Класс-потомок может вызывать методы базового класса, например метод Input класса Book() вызывает Input() із базового класса:
virtual void Input()
{
Item::Input(); // ввод инв номера и названия
cout<<”Введите автора”;
cin>>author;
…
}
Задание:
Создать абстрактный базовый класс Item (предмет в библиотеке), который содержит следующие защищённые поля (protected):
• поле «инвентарный номер предмета»;
• переменную-состояние «взят-невзят»;
• строку «имя»;
защищенные конструкторы:
• по умолчанию;
• с параметрами, задающий инвентарный номер и имя предмета;
открытые методы:
• чисто виртуальный метод Show() (вывод информации на экран);
• виртуальный метод Input() для ввода инвентарного номера и названия;
• метод Take() (взять предмет), устанавливающий состояние «взят»;
• метод Return() (вернуть предмет), устанавливающий состояние «не взят».
Создать производные классы Book, Magazine, в которых переопределить метод Show.
Класс Book содержит следующие закрытые поля:
• поле «автор»;
• поле «год издания»;
открытые конструкторы:
• конструктор по умолчанию,
• конструктор с параметром, принимающий 4 аргумента и инициализирующий поля «инв. номер», «название», «автор», «год издания», и вызывающий нужный конструктор базового класса;
открытые методы:
• метод Input() для ввода данных, ввод инвентарного номера и названия осуществляется путём вызова Input из базового класса
Класс Magazine содержит следующие закрытые поля:
• поле «издательство»;
• поле «номер издания»;
открытые конструкторы:
• конструктор по умолчанию,
• конструктор с параметром, принимающий 4 аргумента и задающий поля «инв. номер», «название», «издательство», «номер издания», и вызывающий нужный конструктор базового класса.
открытые методы:
• метод Input() для ввода данных, ввод инвентарного номера и названия осуществляется путём вызова Input из базового класса
В программе описать функцию Show_Info, которая выводит инвентарный номер объекта, информацию об объекте, а так же его статус «взят-невзят» используя интерфейс абстрактного класса Item.
Создать массив предметов, создавать объекты с использованием меню, в зависимости от введённого значения (например, 1 книга, 2 журнал, 0 закончить создавать объекты). Вывести информацию обо всех объектах, используя виртуальный метод Show().
Item
ook
Magazine