#include #include #include using namespace std; const bool DEBUG=false; // Interface of Number type (abstract class) // its methods are virtual so they can be overridden in derived classes class Number { public: Number() {} Number(string s) {} // constructor based in string representation of number virtual ~Number() {} // makes destructor virtual virtual Number* factoryMethod(string s) const=0; // returns new Number object virtual bool operator==(const Number& n) const=0; // test for equality virtual bool operator!=(const Number& n) const // test for inequality { return !((*this)==n);} virtual Number& operator++()=0; // increment number virtual Number* operator+(const Number& n) const=0; // returns new Number object after addition virtual Number* operator*(const Number& n) const=0; // returns new Number object after multiplication friend std::ostream& operator<<(std::ostream &os, const Number& n); protected: virtual void print(std::ostream &os) const=0; // prints the number }; ostream& operator<<(ostream& os,const Number& n) // this enables "cout<>number; if (number<0) number=-number; // make non-negative, just in case } virtual ~SmallNumber() { if (DEBUG) cout<<"SmallNumber:: ~SmallNumber()"<(n); // get reference to sub-class return this->number==sn.number; } virtual Number& operator++() { if (DEBUG) cout<<"SmallNumber:: "<<"++"<<*this<(n); // get reference to sub-class result->number=number+sn.number; return result; } virtual Number* operator*(const Number& n) const { if (DEBUG) cout<<"SmallNumber:: "<<*this<<" * "<(n); // get reference to sub-class result->number=number*sn.number; return result; } protected: virtual void print(std::ostream &os) const { os<"<