#include <iostream>     
class StatusPrinter{
 public:
   virtual void printStatus()=0;
 }; 
class Counter {
 public:
  Counter():value(0){};    
  Counter(int n):value(n){};    
  int getValue() {
   return value; } 
  void increment(){value++;}                  
 protected:
  int value;  
 }; 
class Accumulator:public StatusPrinter {
 public:
  Accumulator():sum(0){}
  Accumulator(int n):sum(n){}
  void add(int n){sum += n;} 
  int getSum(){return sum;}  
   void printStatus(){cout << "Sono un accumulatore e il mio contenuto e' "<< sum << endl;}
 private:
  int sum;
 }; 
class BigCounter :public Counter , public StatusPrinter{
 public:
  void increment(){Counter::increment();Counter::increment();}
  void printStatus(){cout << "Sono un contatore e il mio contenuto e' "<< Counter::value <<endl;}
 }; 
 void interroga(StatusPrinter* s){ s->printStatus();}
 main() {  
       
 BigCounter *c1 =new BigCounter();
 Accumulator *c2 = new Accumulator();
 StatusPrinter *p;
                                    
 cout << c1->getValue() << endl;
 cout << c2->getSum() << endl;
 c1->increment();c2->add(5);
 p = c1; interroga(p);
 p = c2; interroga(p);
}
