Практическое занятие № 13
Тема: множественное наследование в ООП и полиморфизм
Цель работы: получить практические навыки по созданию каскада порожденных классов и переопределению методов в них
Ход работы
1. Пусть имеется класс Box для описания некоторой коробки со свойствами: длина, ширина и высота.
Описать класс с указанными свойствами, конструктором по умолчанию и конструктором с передачей параметров, методами ввода, вывода и расчета объема коробки.
Оформит класс в виде модульного файла.
Указания: текст модуля может иметь вид:
#ifndef BOX_H
#define BOX_H
#include <iostream.h>
//описываем класс
class box
{
public:
//свойства класса: длина, ширина, высота
int dlina, shirina, vysota;
//конструктор со значениями по умолчанию
box() { dlina=1; shirina=1; vysota=1; }
//конструктор со значениями в виде параметров
box (int a, int b, int c)
{
dlina=a;
shirina=b;
vysota=c;
}
//метод ввода свойств класса
void set()
{
cout<<"-длина: "; cin>>dlina;
cout<<"-ширина: "; cin>>shirina;
cout<<"-высота: "; cin>>vysota;
}
//метод вывода свойств метода
void get()
{
cout<<"размер:
"<<dlina<<"x"<<shirina<<"x"<<vysota;
}
//метод расчета объема
long int obyem()
{
return dlina*shirina*vysota;
}
};
#endif
Сохраните текст в файл box.h
2. Создайте программу, которая описывает две коробки: одну с полями по умолчанию, а вторую с заданными параметрами.
Далее на экран выводятся параметры каждой из коробок.
Далее с помощью метода задаются параметры первой коробки и выводятся на экран.
Далее на экран выводится объем каждой коробки и суммарный объем.
Указания: текст программы имеет вид:
#include <iostream.h>
//модуль для работы с ящиком
#include "box.h"
int main()
{
system("cls");
system("chcp 1251>nul");
//описываем два ящика
//b1 - ящик со свойствами по умолчанию
//b2 - ящик со значениями в виде параметров
box b1, b2(5,3,6);
//выводим данные обоих ящиков
cout<<"Размер первого ящика: "; b1.get();
cout<<"\nРазмер второго ящика: "; b2.get();
//вводим данные первого ящика
cout<<"\nВведите новый размер первого ящика:\n"; b1.set();
//выводи обновленные данные первого ящика
cout<<"Размер первого ящика: "; b1.get();
//выводим объемы ящиков
cout<<"\nОбъем первого ящика: "<<b1.obyem();
cout<<"\nОбъем второго ящика: "<<b2.obyem();
cout<<"\nОбщий объем: "<<b1.obyem()+b2.obyem()<<"\n";
system("pause");
}
3. На основании класса Box создайте произвольный класс Cake_box. Такая коробка кроме длины, ширины и высоты имеет дополнительные свойства: вес и название.
Опишите производный класс, определите в новом классе два конструктора: со значениями по умолчанию и с параметрами, переопределите методы ввода и вывода.
Новый класс сохраните в отдельный модульный файл cake_box.h
Указания: для переопределения методов из родительского класса вначале необходимо открыть файл box.h и пометить переопределяемые методы как виртуальные, добавив в заголовки методов ключевое слов virtual.
virtual void set()
virtual void get()
Сохраните изменения.
Создайте новый файл и введите текст второго модуля:
#ifndef CAKE_BOX_H
#define CAKE_BOX_H
#include <iostream.h>
#include <string.h>
//модуль для работы с классом-предком
#include "box.h"
//описываем класс, как потомок от box
class cake_box:public
box
{
public:
//новые свойства: вес и название
int ves;
char nazv[20];
//конструктор со свойствами по умолчанию
//вызываем конструктор из предка и задаем только новые свойства
cake_box() {box::box(); ves=250; strcpy(nazv,"не задано");}
//конструктор со свойствами в виде параметров
//вызываем конструктор из предка и задаем только новые свойства
cake_box(int a, int b, int c, int
v, char nz[])
{
box::box(a,b,c);
ves=v;
strcpy(nazv,nz);
}
//переопределяем метод ввода
//вызываем ввод из предка и добавляем ввод только новых свойств
virtual void set()
{
box::set();
cout<<"-вес: "; cin>>ves; cin.get();
cout<<"-название: "; cin.getline(nazv,19);
}
//переопределяем метод вывода
//вызываем вывод из предка и добавляем вывод только новых свойств
virtual void get()
{
box::get();
cout<<" вес: "<<ves<<" название: "<<nazv;
}
};
#endif
Сохраните текст в файл cake_box.h
4. Создайте программу, которая описывает две коробки второго типа: одну с полями по умолчанию, а вторую с заданными параметрами.
Далее на экран выводятся параметры каждой из коробок.
Далее с помощью метода задаются параметры первой коробки и выводятся на экран.
Далее на экран выводится объем каждой коробки и суммарный объем.
Далее выводится суммарный вес коробок.
Указания: текст программы имеет вид:
#include <iostream.h>
//модуль для работы с ящиком второго типа
#include "cake_box.h"
int main()
{
system("cls");
system("chcp 1251>nul");
//описываем два ящика
//c1 - ящик со свойствами по умолчанию
//c2 - ящик со значениями в виде параметров
cake_box c1,c2(5,3,4,215,"Мечта");
//выводим данные обоих ящиков
cout<<"Информация о первом ящике: "; c1.get();
cout<<"\nИнформация о втором ящике: "; c2.get();
//вводим данные первого ящика
cout<<"\nВведите новые данные о первом ящике:\n"; c1.set();
//выводи обновленные данные первого ящика
cout<<"Информация о первом ящике: "; c1.get();
//выводим объемы ящиков
cout<<"\nОбъем первого ящика: "<<c1.obyem();
cout<<"\nОбъем второго ящика: "<<c2.obyem();
cout<<"\nОбщий объем: "<<c1.obyem()+c2.obyem();
//выводим общий вес ящиков
cout<<"\nОбщий вес ящиков: "<<c1.ves+c2.ves;
system("pause");
}
5. На основании класса Cake_Box создайте произвольный класс TV_box. Такая коробка кроме длины, ширины, высоты, веса и названия имеет дополнительное свойство: марка изделия.
Опишите производный класс, определите в новом классе два конструктора: со значениями по умолчанию и с параметрами, переопределите методы ввода и вывода.
Новый класс сохраните в отдельный модульный файл tv_box.h
6. Создайте программу, которая описывает две коробки третьего типа: одну с полями по умолчанию, а вторую с заданными параметрами.
Далее на экран выводятся параметры каждой из коробок.
Далее с помощью метода задаются новые параметры первой коробки и второй коробок и выводятся на экран.
Далее на экран выводится объем каждой коробки и суммарный объем.
Далее выводится суммарный вес коробок.