//============================================================================
// 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 ];
double a, b, h, r;
for ( int i = 0; i < n; ++i ) {
int curr = 0;
while ( curr < 1 || curr > 3 ) {
cout << "\nВведите " << i + 1 << " объект который хотите добавить:" << endl;
cout << "1 - прямоугольник:" << endl;
cout << "2 - треугольник:" << endl;
cout << "3 - окружность:" << endl;
cin >> curr;
}
if ( curr == 1 ) {
sh[ i ] = new Rectangle();
cout << "Введите две стороны прямоугольника: ";
cin >> a >> b;
Rectangle r( a, b );
} else if ( curr == 2 ) {
sh[ i ] = new Triangle;
cout << "Введите основание и высоту треугольника: ";
cin >> a >> h;
Triangle t( a, h );
} else {
sh[ i ] = new Circle;
cout << "Введите радиус окружности: ";
cin >> r;
Circle c( r );
}
}
cout << endl;
for ( int i = 0; i < n; ++i )
cout << "Площадь " << i + 1 << " фигуры = " << ( *sh[ i ] ).Area() << endl;
delete[] sh;
return 0;
}