#include <iostream>
using namespace std;

struct Point { double x, y; };
class Shape
{
public:
	Point* arc;
	char Id;
	virtual void info() = 0;
	virtual ~Shape() {}
	static Shape* createShape(char);
	virtual int getArea() { return 0; }
};

class Rectangle : public Shape
{
public:
	void info() { cout << "Четырехугольник" << endl; }
	Rectangle() { Id = 'R';
	arc = new Point[4];
	cout << "Вершина 1"; cin >> arc[0].x;/*... */ }
	int getArea() { return 4; }
	~Rectangle() { delete[] arc; }
};

class Triangle : public Shape
{
public:
	void info() { cout << "Треугольник" << endl; }
};

class Octagon : public Shape
{
public:
	void info() { cout << "Восьмиугольник" << endl; }
};

//Фабричныйметод
Shape* Shape::createShape(char cd)
{
	Shape* sh = 0;
	switch (cd)
	{
	case 'T':
		sh = new Triangle(); break;
	case 'R':
		sh = new Rectangle(); break;
	case 'O':
		sh = new Octagon(); break;
	default: break;
	}
	return sh;
}

int main()
{
	setlocale(LC_ALL, "Russian");
	Shape* p1 = 0;
	char T;
	cout << "Тип?  ";
	cin >> T;
	p1 = Shape::createShape(T);
	if (!p1) return 0; p1->info();
	p1->getArea();
	delete p1;
	return 0;
}