//============================================================================
// Name : ex_inherit_cpp.cpp
// Author :
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
#include <cmath>
#include <typeinfo>
using namespace std;
// пользователь вводит количество объектов, создать массив указателей на базовый класс
// используя элемент массива (указатель) создать объект прооизводного класса, спросив у пользователя какой именно
// ввести значения полей каждого объекта
// вывести в цикле площади всех объектов
class Shape {
public:
virtual double Area() const = 0; // чисто виртуальные методы
virtual double Perimeter() const = 0;
virtual ~Shape() {
}
};
class Rectangle: public Shape {
private:
double a, b;
public:
Rectangle( const double a = 0, const double b = 0 ) :
a( a ), b( b ) {
}
double Area() const {
return a * b;
}
double Perimeter() const {
return 2 * ( a + b );
}
double getA() const {
return a;
}
void setA( double a ) {
this->a = a;
}
double getB() const {
return b;
}
void setB( double b ) {
this->b = b;
}
};
class Triangle: public Shape {
private:
double a, h;
public:
Triangle( const double a = 0, const double h = 0 ) :
a( a ), h( h ) {
}
double Area() const {
return ( a * h ) / 2;
}
double Perimeter() const {
return 2 * ( sqrt( a * a - h * h ) + 2 * a );
}
double getA() const {
return a;
}
void setA( double a ) {
this->a = a;
}
double getH() const {
return h;
}
void setH( double h ) {
this->h = h;
}
};
class Circle: public Shape {
private:
double r;
public:
Circle( const double r = 0 ) :
r( r ) {
}
double Area() const {
return M_PI * r * r;
}
double Perimeter() const {
return 2 * M_PI * r;
}
double getR() const {
return r;
}
void setR( double r ) {
this->r = r;
}
};
int main() {
/*Rectangle r(3, 4); // = { 3, 4 };
cout << r.Area() << endl;
Shape* sh = &r;
cout << sh->Perimeter() << endl;*/
int n;
cout << "Введите количество объектов: " << endl;
cin >> n;
Shape **sh = new Shape*[ n ];
for ( int i = 0; i < n; ++i ) {
int curr = 0;
while ( curr < 1 || curr > 3 ) {
cout << "Введите " << i + 1 << " объект который хотите добавить:" << endl;
cout << "1 - прямоугольник:" << endl;
cout << "2 - треугольник:" << endl;
cout << "3 - окружность:" << endl;
cin >> curr;
}
if ( curr == 1 )
sh[ i ] = new Rectangle;
else if ( curr == 2 )
sh[ i ] = new Triangle;
else
sh[ i ] = new Circle;
}
cout << "Введите значение полей каждого объекта:" << endl;
double a, b, h, r;
for ( int i = 0; i < n; ++i ) {
if ( typeid(Rectangle) == typeid(*sh[ i ]) ) {
cout << "Введите две стороны прямоугольника: ";
cin >> a >> b;
(*sh[i]).SetA(a);
} else if (typeid(Triangle) == typeid(*sh[ i ]) ) {
cout << "Введите основание и высоту треугольника: ";
cin >> a >> h;
Triangle t(a, h);
} else {
cout << "Введите радиус окружности: ";
cin >> r;
Circle c(r);
}
}
for (int i = 0; i < n; ++i) {
cout << "Площадь " << i + 1 << " фигуры = " << (*sh[i]).Area() << endl;
}
delete[] sh;
return 0;
}