Указатель на базовый класс , и использование виртуальных функций, могут сделать операции с объектами классов, порожденных от данного класса, однотипными. Это может быть удобно, когда над множеством объектов нужно произвести однотипные операции. Тут нужно понимать, что для каждого класса эти однотипные операции могут иметь свою специфику. Пример:
class Point
{
public:
int x,y;
Point (int nx, int ny):x(nx),y(ny) {}
virtual void Show ()
{
cout<<"("<<x<<","<<y<<")"<<endl;
}
virtual void Move(int dx, int dy)
{
x+=dx;
y+=dy;
}
};
class Rectangle: public Point
{
public:
int x1,y1;
Rectangle (int nx,int ny,int nx1,int ny1):Point(nx,ny),x1(nx1),y1(ny1) {}
virtual void Show ()
{
cout <<"("<<x<<","<<y<<")-("<<x1<<","<<y1<<")"<<endl;
}
virtual void Move(int dx, int dy)
{
x+=dx;
y+=dy;
x1+=dx;
y1+=dy;
}
};
class ColorRectangle: public Rectangle
{
public:
int color;
ColorRectangle (int nx, int ny, int nx1, int ny1,int ncolor):Rectangle(nx,ny,nx1,ny1),color(ncolor) {}
virtual void Show()
{
cout<<"("<<x<<","<<y<<")-("<<x1<<","<<y1<<") "<<color<<endl;
}
virtual void Move(int dx,int dy)
{
x+=dx;
y+=dy;
x1+=dx;
y1+=dy;
color++;
}
};
void main()
{
Point *p[3];
p[0]=new Point (100,100);
p[1]=new Rectangle(150,150,200,200);
p[2]=new ColorRectangle(300,300,400,400,0);
for (int i=0;i<3;i++)
p[i]->Show();
for (int i=0;i<3;i++)
p[i]->Move(10,10);
for (int i=0;i<3;i++)
p[i]->Show();
for (int i=0;i<3;i++)
delete p[i];
}
Обратите внимание на то, что однотипность операций достигается за счет того, что массив указателей имеет соответственно тип “Point”, а специфика работы с объектом каждого класса достигается за счет того, что функции Show() и Move() являются виртуальными.