#include <iostream.h>
// Базовый класс Figure
class	Figure 
{
public:
	// Виртуальный метод
	virtual void PrintName(void) 
      {cout<< "Figure PrintName"<< "\n";};
	// Невиртуальный метод
	void	PrintDimention(void) 
		{cout << "Figure PrintDimention" << "\n";};
};

// Порожденный класс Rectangle
class	Rectangle : public Figure
{
public:
	// Переопределяем виртуальный метод базового класса
	virtual void PrintName(void)
      {cout << "Rectangle PrintName" << "\n";}

	// Переопределяем невиртуальный метод базового класса
	void	PrintDimention(void)
		{cout << "Rectangle PrintDimention" << "\n";}
};

// Главная функция
void main(void)
{
	// Определяем объект порожденного класса
	Rectangle	rectObject;

	// Определяем указатель на объект порожденного класса
	// и инициализируем его 
	Rectangle	*ptrRectObject  = &rectObject;
   
	// Определяем указатель на объект базового класса Figure
	// и записываем в него адрес объекта порожденного класса.
	Figure		*ptrFigObject = &rectObject;

	// Вызываем методы класса Rectangle, используя имя объекта
	rectObject.PrintName();
	rectObject.PrintDimention();
	cout << "\n";

	// Вызываем методы класса базового класса Figure
	rectObject.Figure::PrintName();
	rectObject.Figure::PrintDimention();
	cout << "\n";

	// Вызываем методы класса Rectangle, используя указатель на 
	// объекты класса Rectangle
	ptrRectObject->PrintName();
	ptrRectObject->PrintDimention();
	cout << "\n";

	// Вызываем методы, используя указатель на 
	// объекты класса Figure
	ptrFigObject->PrintName();
	ptrFigObject->PrintDimention();
}
