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

Далее на экран выводятся параметры каждой из коробок.

Далее с помощью метода задаются новые параметры первой коробки и второй коробок и выводятся на экран.

Далее на экран выводится объем каждой коробки и суммарный объем.

Далее выводится суммарный вес коробок.