#include <iostream>
#ifdef __BORLANDC__
#else
  using namespace std;
#endif

class Obiekt
  {
   public:
   virtual void Drukuj(ostream &s)const;
   virtual ~Obiekt() {}
  };

void Obiekt::Drukuj(ostream &s)const
  {
   s<<"~";
  }

ostream &operator<<(ostream &s,const Obiekt &Ob)
  {
   Ob.Drukuj(s);
   return(s);
  }

class ObiektPunkt:public Obiekt
  {
   public:
   double x,y;
   ObiektPunkt(double x,double y):x(x),y(y) {}
   virtual void Drukuj(ostream &s)const;
  };

void ObiektPunkt::Drukuj(ostream &s)const
  {
   s<<"("<<x<<','<<y<<')';
  }

class ObiektNapis:public Obiekt
  {
   public:
   char *N;
   ObiektNapis(const char *N):N(strdup(N)) {}
   /*virtual*/ ~ObiektNapis();
   /*virtual*/ void Drukuj(ostream &s)const;
  };

void ObiektNapis::Drukuj(ostream &s)const
  {
   s<<'\"'<<N<<'\"';
  }

ObiektNapis::~ObiektNapis()
  {
   delete[] N;
  }

int main()
  {
   Obiekt *T[3];
   T[0]=new Obiekt();
   T[1]=new ObiektPunkt(3,4);
   T[2]=new ObiektNapis("Ala ma kota");

   for(int i=0;i<3;++i) cout<<(*(T[i]))<<endl;

   for(int i=0;i<3;++i) delete T[i];

   return(0);
  }
