Цель работы: приобрести навыки в использовании простого наследования и полиморфизма.
Задание. Реализовать классы, описанные в вариантах заданий. На примере этих классов продемонстрировать работу механизма позднего связывания.
Создать базовый класс «конус», описав в нём функции ввода параметров, вывода их на экран, нахождения объёма конуса и площади его нижнего основания. Породить от него класс «усеченный конус», переопределив в нем функции ввода и вывода параметров и нахождения объёма фигуры.
Файл classes.h
class cone {
protected:
int r1, h;
public:
virtual void EnterParam(); //ввод параметров
virtual void DisplayParam(); //вывод параметров
virtual double Volume();
double BaseArea();
cone();
};
class frustum: public cone {
private:
int r2;
public:
void EnterParam();
void DisplayParam();
double Volume();
frustum();
};
Файл classes.cpp
#include "classes.h"
#include <iostream>
#include <stdio.h>
#include <string.h>
#define M_PI 3.14159265358979323846
using namespace std;
cone::cone() {
r1 = 0;
h = 0;
}
void cone::EnterParam() {
do {
cout << "Введите радиус нижнего основания" << endl;
cin >> r1;
cout << "Введите высоту конуса" << endl;
cin >> h;
if (r1 <= 0 && h <= 0) {
cout << "Неверно введенные данные" << endl;
}
}
while (r1 <= 0 && h <= 0);
}
void cone::DisplayParam() {
cout << "Радиус нижнего основания=" << r1<<endl;
cout << "Высота конуса=" << h << endl;
}
double cone::Volume(){
if (r1 > 0 && h > 0)
return(0.33333 * M_PI * (r1*r1) *h);
else {
cout << "Сначала введите данные" << endl;
cone::EnterParam();
}
}
double cone::BaseArea() {
if (r1 > 0 && h > 0)
return(M_PI * (r1*r1));
else {
cout << "Сначала введите данные" << endl;
cone::EnterParam();
}
}
frustum::frustum() {
r2 = 0;
}
void frustum::EnterParam() {
cone::EnterParam();
do {
cout << "Введите радус верхнего основания" << endl;
cin >> r2;
if (r2 <= 0 || r2>=r1) {
cout << "Неверно введенный радиус верхнего основания" << endl;
}
} while (r2<=0);
}
void frustum::DisplayParam() {
cone::DisplayParam();
cout << "Радиус верхнего основания=" << r2 << endl;
}
double frustum::Volume(){
return(0.333333*M_PI*h*((r1*r1)+r1*r2+(r2*r2)));
}
Файл mainfile.cpp
#include "classes.h"
#include <stdio.h>
#include <conio.h>
#include <locale.h>
int main()
{
cone cone1;
frustum cone2;
cone *con=&cone1; //указатель нужен для реализации полиморфизма
int key1, key2;
setlocale(0, "RUS"); // обеспесиваем вывод в консольное окно символов кириллицы
do //выбирвем вид эллипса
{
printf("\n1 - обычный конус\n");
printf("2 - усеченный конус\n");
printf("ESC - выход\n");
printf("Ваш выбор: \n");
key1 = _getch();
switch (key1)
{
case '1':
con = &cone1;
break;
case '2':
con = &cone2;
break;
}
if (key1!= 27)
{
do //выбираем действие для выбранного типа эллипса
{
printf("\n1 - ввод параметров\n");
printf("2 - вывод параметров\n");
printf("3 - посчитать обьем конуса\n");
printf("4 - посчитать площадь нижнего основания\n");
printf("ESC - выход\n");
printf("Ваш выбор: \n");
key2 = _getch();
switch (key2)
{
case '1': con->EnterParam(); break;
case '2': con->DisplayParam(); break;
case '3': printf("Обьем конуса равен: %.2lf\n", con->Volume()); break;
case '4': printf("Площадь равна: %.2lf\n", con->BaseArea());break;
break;
}
} while (key2!= 27);
}
} while (key1!= 27);
return 0;
}
Скриншоты:
Выбран вариант с обычным конусом
Вариант с усеченным конусом: