ПРОСТОЕ НАСЛЕДОВАНИЕ И ПОЛИМОРФИЗМ




 

Цель работы: приобрести навыки в использовании простого наследования и полиморфизма.

 

Задание. Реализовать классы, описанные в вариантах заданий. На примере этих классов продемонстрировать работу механизма позднего связывания.

 

Создать базовый класс «конус», описав в нём функции ввода параметров, вывода их на экран, нахождения объёма конуса и площади его нижнего основания. Породить от него класс «усеченный конус», переопределив в нем функции ввода и вывода параметров и нахождения объёма фигуры.

 

Файл 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;

}

 

 

Скриншоты:

 

Выбран вариант с обычным конусом

 

 

 

 

Вариант с усеченным конусом:



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-12-18 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: