Пример : Классы, описывающие точки и окружности.
#include <iostream>
#include <conio.h>
#include <windows.h>
#define _USE_MATH_DEFINES
#include <cmath>
using namespace std;
// Класс, описывающий точку:
class CPoint
{
protected:
int x,y; // координаты точки
public:
// Конструктор:
CPoint(int _x=320, int _y=240)
{ x = _x; y = _y; }
int GetX() {return x;}
virtual double Length() //Виртуальная функция возвращающая длину.
// Для точки - длинна радиус вектора:
{
return sqrt((double)(x*x+y*y));
}
};
// Класс, описывающий окружность (производный от класса CPoint):
class CCircle : public CPoint
{
int r; // радиус окружности
public:
CCircle(){r=2;}
// Основной конструктор:
CCircle(int _x, int _y,int _r):
CPoint (_x, _y) // Явный вызов конструктора базового класса
{r = _r;}
double Length() {return 2*M_PI*r;} // длина окружности
};
// Пример использования классов:
int main()
{
//Настройки шрифтов и региональных стандартов:
if(SetConsoleCP(1251)==0)
//проверка правильности установки кодировки символов для ввода
{
cerr<<"Fialed to set codepage!"<<endl;
/* если не удалось установить кодовую страницу, вывод сообщения об ошибке */
}
if(SetConsoleOutputCP(1251)==0)//тоже самое для вывода
{
cerr<<"Failed to set OUTPUT page!"<<endl;
}
CPoint** ptr = new CPoint*[5]; /* помните, что указатель на объект производного класса является одновременно и указателем на объект базового класса */
// создаем несколько объектов:
ptr[0] = new CPoint (100, 100);
ptr[1] = new CCircle(200,150, 10);
ptr[2] = new CPoint (100,200);
ptr[3] = new CCircle(200,250,10);
ptr[4] = new CPoint(100,300);
/* такого типа цикл можно написать только при использовании виртуальных функций: */
for (int i=0; i<5; i++)
cout<<"Длинна объекта "<<ptr[i]->Length()<<endl;
// одним оператором обрабатываем объекты разных типов
//------------------------------------
for (int i=0; i<5; i++)
delete ptr[i];
delete ptr;
_getch();
return 0;
}