// @topic T071320 Inheritance demo, vector of CPrimitive*
// @brief CPrimitive, CPrimitiveLine, CPrimitiveCircle, CPrimitiveRectangle

#include <cstdlib>
#include <iostream>
#include <vector>

using namespace std;


class CPrimitive {
public:
    virtual void draw() = 0; // pure virtual function
    virtual ~CPrimitive() {} // virtual destructor
};//class CPrimitive


class CPrimitiveLine : public CPrimitive {
public:
    void draw() {
        cout << __FUNCTION__ << "\n";
    }
};//class CPrimitiveLine


class CPrimitiveCircle : public CPrimitive {
public:
    void draw() {
        cout << __FUNCTION__ << "\n";
    }
};//class CPrimitiveCircle


class CPrimitiveRectangle : public CPrimitive {
public:
    void draw() {
        cout << __FUNCTION__ << "\n";
    }
};//class CPrimitiveRectangle


void doit()
{
    //typedef vector< CPrimitive* > VectorPrimitives;
    //VectorPrimitives primitives;
    vector< CPrimitive* > primitives;
    primitives.push_back( new CPrimitiveLine );
    primitives.push_back( new CPrimitiveCircle );
    primitives.push_back( new CPrimitiveLine );
    primitives.push_back( new CPrimitiveCircle );
    primitives.push_back( new CPrimitiveLine );
    primitives.push_back( new CPrimitiveRectangle );
    primitives.push_back( new CPrimitiveLine );
    primitives.push_back( new CPrimitiveRectangle );

    for ( CPrimitive* primitive : primitives ) primitive->draw();
    for ( CPrimitive* primitive : primitives ) delete primitive;
    primitives.clear();
}


int main()
{
    doit();
    system( "pause" );
}