#include #include #include using namespace std; class FormaGeometrica{ public: virtual ~FormaGeometrica() {} virtual float perimetro() const = 0; virtual float area() const = 0; virtual string colore() const { return "blue"; } virtual void print() const = 0; }; class Quadrato: public FormaGeometrica{ public: Quadrato(){myLato=0;} Quadrato(float lato){myLato=lato;} virtual ~Quadrato(){} float lato() const {return myLato;} virtual float perimetro() const {return 4*myLato;} virtual float area() const {return myLato*myLato;} virtual void print() const { cout << "Quadrato l=" << lato() << " area " << area() << " colore " << colore() << endl; } private: float myLato; }; class Circonferenza: public FormaGeometrica{ public: Circonferenza(){myRaggio=0;} Circonferenza(float r){myRaggio = r;} virtual ~Circonferenza(){} float raggio() const {return myRaggio;} virtual float perimetro() const {return 4*3.14*myRaggio;} virtual float area() const {return 3.14*myRaggio*myRaggio;} string colore() const { return "red"; } virtual void print() const { cout << "Circonferenza r=" << raggio() << " area " << area() << " colore " << colore() << endl; } private: float myRaggio; }; void draw(FormaGeometrica* f) ; class Schermo { public: Schermo() { numElementi_ = 0; //elementi_ = FormaGeometrica[]; } ~Schermo() { erase(); } void add(const FormaGeometrica* fg){ elementi_.push_back(fg); } void print() const { cout << "Schermo::print" << endl; for (vector::const_iterator fg=elementi_.begin(); fgprint(); } } void erase(){ for (vector::const_iterator fg=elementi_.begin(); fg elementi() const { return elementi_; } int numElementi() const { return elementi_.size(); } private: int numElementi_; vector elementi_; }; int main () { FormaGeometrica *q = new Quadrato(3.); FormaGeometrica *circ = new Circonferenza(3.); Schermo schermo; schermo.add(q); schermo.print(); schermo.add(circ); schermo.print(); schermo.erase(); schermo.print(); draw(q); draw(circ); Circonferenza c(66.); cout <<"La circonferenza ha raggio "<lato()<<" perimetro "<perimetro()<<" e area "<area()<perimetro() << " colore " << f->colore() << endl; }