this->vpointer[vfunctionIndex](regular_arguments)
class Shape
{
public:
virtual double area() = 0;
virtual ~Shape() {}
};
class Triangle
: public Shape
{
protected:
double base;
double height;
public:
Triangle( double newBase, double newHeight )
: base( newBase ), height( newHeight )
{
}
virtual double area()
{
return base * height / 2.0;
}
virtual ~Triangle() {}
};
class Square
: public Shape
{
protected:
double side;
public:
Square( double newSide )
: side( newSide )
{
}
virtual double area()
{
return side * side;
}
virtual ~Square() {}
};
typedef class ShapeLinkedListPair * ShapeLinkedList;
class ShapeLinkedListPair
{
public:
Shape * info;
ShapeLinkedList next;
ShapeLinkedListPair( Shape * newInfo, ShapeLinkedList newNext )
: info(newInfo), next( newNext )
{
}
};
class Picture
{ ShapeLinkedList head;
public:
Picture()
: head( 0 )
{
}
void enter( Shape * a )
{
head = new ShapeLinkedListPair( a, head );
}
double totalArea()
{
double total = 0.0;
for (ShapeLinkedList p = head; p != 0; p = p->next)
total += p->info->area();
return total;
}
};
int main()
{
Picture p;
p.enter( new Triangle(10,10) );
p.enter( new Square(10) );
cout << "Total area = " << p.totalArea() << endl;
}