|
итоговый отчет 1. Лабораторная работа 2 Классы. Основы 12 Лабораторная работа 3 Классы. Инкапсуляция 16
Лабораторная работа №5 Наследование. Полиморфизм
Цель работы:приобретение практических навыков применения наследования и полиморфизма как основных принципов объектно-ориентированного программирования при разработке программ на языке C++, включая рассмотрение следующих вопросов:
1. Одиночное наследование классов.
2. Допустимые привидения типов при наследовании.
3. Автоматическое приведение класса-наследника к базовому классу (аргумент функции, прямое присваивание).
4. Модификаторы наследования.
5. Ключевое слово virtual и полиморфизм методов.
1. Задание для работы
1. Построить иерархию классов: Shape (Фигура) -> Circle (Круг) -> Torus (Тор) –> Rectangle (Прямоугольник)
2. Написать программу, которая:
2.1. Считывает с консоли количество фигур.
2.2. В цикле считывает параметры фигур. Сначала запрашивается тип фигуры и создается объект нужного класса. Затем у объекта вызывается метод read() и вводятся характеристики объекта (радиус для круга, расстояние от центра образующей окружности до оси вращения и радиус образующей окружности для тора, длины стороны для прямоугольника, и т.д.).
2.3. Считанные объекты помещаются в массив.
2.4. Производится поиск фигуры, имеющей максимальную площадь или площадь поверхности (для объемных фигур). Производится вывод найденной фигуры на экран.
Код программы на языке C++
В результате выполнения задания была разработана программа на языке C++, код которой приведен ниже:
// файл Shape.h
#pragma once
#include "StdAfx.h"
#include
#include using namespace std; class Shape
{
private:
virtual void calculate(); protected:
double S;
string name;
virtual ostream& print(ostream& out); public:
Shape(string NAME = "undefined");
virtual Shape(); virtual void read();
double get_area();
string get_name(); friend ostream& operator<<(ostream& out, Shape& item);
}; // файл Shape.cpp
#include "StdAfx.h"
#include "Shape.h" Shape::Shape(string NAME) : name (NAME), S(0)
{
cout << "Сработал конструктор класса Shape для фигуры " << name <<
endl;
} Shape::Shape()
{
cout << "Сработал деструктор класса Shape для фигуры " << name <<
endl;
} void Shape::read()
{
cout << "Введите параметры фигуры " << name << ":" << endl;
} double Shape::get_area()
{
return S;
} string Shape::get_name()
{
return name;
} void Shape::calculate()
{
}
ostream& Shape::print(ostream& out)
{
out << "Фигура " << name << " имеет следующие параметры: " << endl;
out << "Площадь = " << S << endl;
return out;
} ostream& operator<<(ostream& out, Shape& item)
{
return item.print(out);
}
// файл circle.h
#pragma once
#include "StdAfx.h"
#include "shape.h" class Circle : public Shape
{
private:
virtual void calculate();
protected:
double r;
ostream& print(ostream& out);
public:
Circle(string name = "Круг", double R=0);
virtual Circle();
virtual void read();
};
// файл Circle.cpp
#include "StdAfx.h"
#define _USE_MATH_DEFINES
#include
#include "circle.h" Circle::Circle(string NAME, double R) : Shape(NAME), r(R)
{
cout << "Сработал конструктор класса Circle для фигуры " << name << endl;
} Circle::Circle()
{
cout << "Сработал деструктор класса Circle для фигуры " << name << endl;
} void Circle::read()
{
Shape::read();
cout << "Радиус: ";
cin >> r;
calculate();
} void Circle::calculate()
{
S = M_PI * r * r;
} ostream& Circle::print(ostream& out)
{
Shape::print(out);
out << "Радиус = " << r << endl;
return out;
}
// файл torus.h
#pragma once
#include "StdAfx.h"
#include "circle.h" class Torus : public Circle
{
private:
void calculate();
protected:
double r, R;
ostream& print(ostream& out);
public:
Torus(string name = "Тор", double r = 0, double R=0);
virtual Torus();
void read();
};
// файл Torus.cpp
#include "StdAfx.h"
#include "torus.h" Torus::Torus(string NAME, double R, double r) : Circle(NAME, R)
{
cout << "Сработал конструктор класса Sphere для фигуры " << name << endl;
} Torus::Torus()
{
cout << "Сработал деструктор класса Sphere для фигуры " << name << endl;
} void Torus::read()
{
cout << "Внешний радиус: ";
cin >> r;
cout << "Внутренний радиус: ";
cin >> R;
calculate();
} void Torus::calculate()
{
S = 2 * 3.14 * 3.14 * R * r * r;
} ostream& Torus::print(ostream& out)
{
Shape::print(out);
out << "Расстояние от центра образующей окружности r = " << r << endl;
out << "Радиус образующей окружности R = " << R << endl;
return out;
}
// файл Rectangle.h
#pragma once
#include "StdAfx.h"
#include "Shape.h" class Rectangle : public Shape
{
private:
void calculate();
protected:
double length;
double width;
ostream& print(ostream& out);
public:
Rectangle(string name = "Прямоугольник", double LENGTH = 0, double WIDTH = 0);
Rectangle();
void read();
};
// файл Rectangle.cpp
#include "StdAfx.h"
#include "rectangle.h" Rectangle::Rectangle(string NAME, double LENGTH, double WIDTH) : Shape(NAME), length(LENGTH), width(WIDTH)
{
cout << "Сработал конструктор класса Rectangle для фигуры " << name << endl;
} Rectangle::Rectangle()
{
cout << "Сработал деструктор класса Rectangle для фигуры " << name << endl;
} void Rectangle::read()
{
Shape::read();
cout << "Длина: ";
cin >> length;
cout << "Ширина: ";
cin >> width;
calculate();
} void Rectangle::calculate()
{
S = length * width;
} ostream& Rectangle::print(ostream& out)
{
Shape::print(out);
out << "Длина = " << length << endl;
out << "Ширина = " << width << endl;
return out;
} // файл main.cpp
#include "StdAfx.h"
#include "shape.h"
#include "torus.h"
#include "circle.h"
#include "rectangle.h"
#include using namespace std; int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL, "Russian");
cout << "Введите количество фигур: ";
int n;
cin >> n;
if (n <= 0)
{
cout << "Количество фигур должно быть >= 0" << endl;
system("pause");
return 0;
}
Shape **arr = new Shape*[n];
int choose;
cout << "Выберите фигуру:" << endl;
cout << "1 - Прямоугольник\n";
cout << "2 - Тор\n";
cout << "3 - Окружность\n";
for (int i = 0; i < n; i++)
{
cout << "Выберите фигуру. Для этого введите цифру, соответствующую её типу." << endl;
cout << "Введите тип фигуры №" << i + 1 << ":";
cin >> choose;
switch (choose)
{
case 1:
arr[i] = new Rectangle;
break;
case 2:
arr[i] = new Torus;
break;
case 3:
arr[i] = new Circle ;
break;
default:
cout << "Ошибка\n";
break;
}
arr[i]->read();
cout << *(arr[i]) << endl;
}
int max_Si = 0;
for (int i = 0; i < n; i++)
if (arr[i]->get_area() > arr[max_Si]->get_area())
max_Si = i;
cout << "Самую большую площадь имеет фигура " << arr[max_Si]->get_name() << " :\n";
cout << *arr[max_Si] << endl; for (int i = 0; i < n; i++)
delete arr[i];
delete[] arr;
system("pause");
return 0;
}
Результат работы программы на языке C++
Введите количество фигур: 3
Выберите фигуру:
1 - Прямоугольник
2 - Тор
3 - Окружность
Выберите фигуру. Для этого введите цифру, соответствующую её типу.
Введите тип фигуры №1:1
Сработал конструктор класса Shape для фигуры Прямоугольник
Сработал конструктор класса Rectangle для фигуры Прямоугольник
Введите параметры фигуры Прямоугольник:
Длина: 2
Ширина: 4
Фигура Прямоугольник имеет следующие параметры:
Площадь = 8
Длина = 2
Ширина = 4 Выберите фигуру. Для этого введите цифру, соответствующую её типу.
Введите тип фигуры №2:2
Сработал конструктор класса Shape для фигуры Тор
Сработал конструктор класса Circle для фигуры Тор
Сработал конструктор класса Sphere для фигуры Тор
Внешний радиус: 1
Внутренний радиус: 2
Фигура Тор имеет следующие параметры:
Площадь = 39.4384
Расстояние от центра образующей окружности r = 1
Радиус образующей окружности R = 2 Выберите фигуру. Для этого введите цифру, соответствующую её типу.
Введите тип фигуры №3:3
Сработал конструктор класса Shape для фигуры Круг
Сработал конструктор класса Circle для фигуры Круг
Введите параметры фигуры Круг:
Радиус: 4
Фигура Круг имеет следующие параметры:
Площадь = 50.2655
Радиус = 4 Самую большую площадь имеет фигура Круг :
Фигура Круг имеет следующие параметры:
Площадь = 50.2655
Радиус = 4 Сработал деструктор класса Rectangle для фигуры Прямоугольник
Сработал деструктор класса Shape для фигуры Прямоугольник
Сработал деструктор класса Sphere для фигуры Тор
Сработал деструктор класса Circle для фигуры Тор
Сработал деструктор класса Shape для фигуры Тор
Сработал деструктор класса Circle для фигуры Круг
Сработал деструктор класса Shape для фигуры Круг
Для продолжения нажмите любую клавишу . . . |
|
|