Polymorphism: Difference between revisions

From Rosetta Code
Content added Content deleted
Line 14: Line 14:


'''Libraries:''' Standard
'''Libraries:''' Standard
/* After reading this you may understand */
/* why Bjarne Stroustrup's invented C++ */
#if defined( _WIN32 ) || defined( MSC_VER )
#if defined( _WIN32 ) || defined( MSC_VER )
#define FN_PTR(x) (& x)
#define FN_PTR(x) (& x)
Line 24: Line 26:
int x;
int x;
int y;
int y;
void (*print)();
void (*dtor)(); /* virtual */
void (*print)(); /* virtual */
} Point;
} Point;


Line 31: Line 34:
Point* pthis = (Point*) malloc( sizeof( Point ) );
Point* pthis = (Point*) malloc( sizeof( Point ) );
memset(pthis, 0, sizeof( Point ) );
memset(pthis, 0, sizeof( Point ) );
pthis->dtor = FN_PTR(Point_dtor);
pthis->print = FN_PTR(Point_print);
pthis->print = FN_PTR(Point_print);
}
}
Line 39: Line 43:
pthis->x = x0;
pthis->x = x0;
pthis->y = 0;
pthis->y = 0;
pthis->dtor = FN_PTR(Point_dtor);
pthis->print = FN_PTR(Point_print);
pthis->print = FN_PTR(Point_print);
}
}
Line 47: Line 52:
pthis->x = x0;
pthis->x = x0;
pthis->y = y0;
pthis->y = y0;
pthis->dtor = FN_PTR(Point_dtor);
pthis->print = FN_PTR(Point_print);
pthis->print = FN_PTR(Point_print);
}

void Point_delete(Point** pthis)
{
if(pthis && *pthis)
{
pthis->dtor();
free(*pthis); *pthis = NULL;
}
}
}


Line 54: Line 69:
Point* pthis = (Point*) malloc( sizeof( Point ) );
Point* pthis = (Point*) malloc( sizeof( Point ) );
memcpy(pthis, p, sizeof( Point ) );
memcpy(pthis, p, sizeof( Point ) );
pthis->dtor = FN_PTR(Point_dtor);
pthis->print = FN_PTR(Point_print);
return pthis;
return pthis;
}
}
Line 62: Line 79:
int Point_setY(Point* pthis, int y0) { pthis->y = y0; }
int Point_setY(Point* pthis, int y0) { pthis->y = y0; }
void Point_print() { printf("Point\n"); }
void Point_print() { printf("Point\n"); }
void Point_vprint(Point* pthis) { pthis->print(); }
void Point_dtor() {}


// Trick: This way Circle.x, Circle.y, Circle.r are available
// Trick: This way Circle.x, Circle.y, Circle.r are available
Line 80: Line 97:
Circle* pthis = (Circle*) malloc( sizeof( Circle ) );
Circle* pthis = (Circle*) malloc( sizeof( Circle ) );
memset(pthis, 0, sizeof( Circle ) );
memset(pthis, 0, sizeof( Circle ) );
pthis->dtor = FN_PTR(Circle_dtor);
pthis->print = FN_PTR(Circle_print);
pthis->print = FN_PTR(Circle_print);
}
}
Line 89: Line 107:
pthis->y = 0;
pthis->y = 0;
pthis->r = 0;
pthis->r = 0;
pthis->dtor = FN_PTR(Circle_dtor);
pthis->print = FN_PTR(Circle_print);
pthis->print = FN_PTR(Circle_print);
}
}
Line 98: Line 117:
pthis->y = y0;
pthis->y = y0;
pthis->r = 0;
pthis->r = 0;
pthis->dtor = FN_PTR(Circle_dtor);
pthis->print = FN_PTR(Circle_print);
pthis->print = FN_PTR(Circle_print);
}
}
Line 107: Line 127:
pthis->y = y0;
pthis->y = y0;
pthis->r = r0;
pthis->r = r0;
pthis->dtor = FN_PTR(Circle_dtor);
pthis->print = FN_PTR(Circle_print);
pthis->print = FN_PTR(Circle_print);
}
}
Line 116: Line 137:
pthis->y = p->y;
pthis->y = p->y;
pthis->r = 0;
pthis->r = 0;
pthis->dtor = FN_PTR(Circle_dtor);
pthis->print = FN_PTR(Circle_print);
pthis->print = FN_PTR(Circle_print);
}
}
Line 125: Line 147:
pthis->y = p->y;
pthis->y = p->y;
pthis->r = r0;
pthis->r = r0;
pthis->dtor = FN_PTR(Circle_dtor);
pthis->print = FN_PTR(Circle_print);
pthis->print = FN_PTR(Circle_print);
}

void Circle_delete(Circle** pthis)
{
if(pthis && *pthis)
{
pthis->dtor();
free(*pthis); *pthis = NULL;
}
}
}


Line 132: Line 164:
Circle* pthis = (Circle*) malloc( sizeof( Circle ) );
Circle* pthis = (Circle*) malloc( sizeof( Circle ) );
memcpy(pthis, c, sizeof( Circle ) );
memcpy(pthis, c, sizeof( Circle ) );
pthis->dtor = FN_PTR(Circle_dtor);
pthis->print = FN_PTR(Circle_print);
return pthis;
return pthis;
}
}
Line 142: Line 176:
int Circle_setR(Circle* pthis, int r0) { pthis->r = r0; }
int Circle_setR(Circle* pthis, int r0) { pthis->r = r0; }
void Circle_print() { printf("Circle\n"); }
void Circle_print() { printf("Circle\n"); }
void Circle_vprint(Circle* pthis) { pthis->print(); }
void Circle_dtor() {}

int main()
{
Point* p = Point_new0();
Point* c = (Point*)Circle_new0();
p->print();
c->print();
return 0;
}


==[[C plus plus|C++]]==
==[[C plus plus|C++]]==

Revision as of 04:59, 23 February 2007

Task
Polymorphism
You are encouraged to solve this task according to the task description, using any language you may know.

Create two classes Point and Circle with a polymorphic function

BASIC

Interpeter: QuickBasic 4.5, PB 7.1

C

Compiler: GCC, MSVC, BCC, Watcom

Libraries: Standard

 /* After reading this you may understand */ 
 /* why Bjarne Stroustrup's invented C++  */
 #if defined( _WIN32 ) || defined( MSC_VER )
 #define FN_PTR(x) (& x)
 #else
 #define FN_PTR(x) (x)
 #endif
 typedef struct Point
 {
   int x;
   int y;
   void (*dtor)();   /* virtual */
   void (*print)();  /* virtual */
 } Point;
 Point* Point_new0()
 {
   Point* pthis = (Point*) malloc( sizeof( Point ) );
   memset(pthis, 0, sizeof( Point ) );
   pthis->dtor  = FN_PTR(Point_dtor);
   pthis->print = FN_PTR(Point_print);
 }
 Point* Point_new1(int x0)
 {
   Point* pthis = (Point*) malloc( sizeof( Point ) );
   pthis->x = x0;
   pthis->y = 0;
   pthis->dtor  = FN_PTR(Point_dtor);
   pthis->print = FN_PTR(Point_print);
 }
 Point* Point_new2(int x0, int y0)
 {
   Point* pthis = (Point*) malloc( sizeof( Point ) );
   pthis->x = x0;
   pthis->y = y0;
   pthis->dtor  = FN_PTR(Point_dtor);
   pthis->print = FN_PTR(Point_print);
 }
 void Point_delete(Point** pthis)
 {
   if(pthis && *pthis)
   {
     pthis->dtor();
     free(*pthis); *pthis = NULL;
   }
 }
 Point* Point_copy(Point* p)
 {
   Point* pthis = (Point*) malloc( sizeof( Point ) );
   memcpy(pthis, p, sizeof( Point ) );
   pthis->dtor  = FN_PTR(Point_dtor);
   pthis->print = FN_PTR(Point_print);
   return pthis;
 }
 int Point_getX(Point* pthis) { return pthis->x; }
 int Point_getY(Point* pthis) { return pthis->y; }
 int Point_setX(Point* pthis, int x0) { pthis->x = x0; }
 int Point_setY(Point* pthis, int y0) { pthis->y = y0; }
 void Point_print() { printf("Point\n"); }
 void Point_dtor() {}
 // Trick: This way Circle.x, Circle.y, Circle.r are available
 typedef union Circle
 {
   Point point;
   struct _Circle
   {
     Point point;
     int r;
   };
 } Circle;


 Circle* Circle_new0()
 {
   Circle* pthis = (Circle*) malloc( sizeof( Circle ) );
   memset(pthis, 0, sizeof( Circle ) );
   pthis->dtor  = FN_PTR(Circle_dtor);
   pthis->print = FN_PTR(Circle_print);
 }
 Circle* Circle_new1(int x0)
 {
   Circle* pthis = (Circle*) malloc( sizeof( Circle ) );
   pthis->x = x0;
   pthis->y = 0;
   pthis->r = 0;
   pthis->dtor  = FN_PTR(Circle_dtor);
   pthis->print = FN_PTR(Circle_print);
 }
 Circle* Circle_new2(int x0, int y0)
 {
   Circle* pthis = (Circle*) malloc( sizeof( Circle ) );
   pthis->x = x0;
   pthis->y = y0;
   pthis->r = 0;
   pthis->dtor  = FN_PTR(Circle_dtor);
   pthis->print = FN_PTR(Circle_print);
 }
 Circle* Circle_new3(int x0, int y0, int r0)
 {
   Circle* pthis = (Circle*) malloc( sizeof( Circle ) );
   pthis->x = x0;
   pthis->y = y0;
   pthis->r = r0;
   pthis->dtor  = FN_PTR(Circle_dtor);
   pthis->print = FN_PTR(Circle_print);
 }
 Circle* Circle_newP0(Point* p)
 {
   Circle* pthis = (Circle*) malloc( sizeof( Circle ) );
   pthis->x = p->x;
   pthis->y = p->y;
   pthis->r = 0;
   pthis->dtor  = FN_PTR(Circle_dtor);
   pthis->print = FN_PTR(Circle_print);
 }
 Circle* Circle_newP1(Point* p, int r0)
 {
   Circle* pthis = (Circle*) malloc( sizeof( Circle ) );
   pthis->x = p->x;
   pthis->y = p->y;
   pthis->r = r0;
   pthis->dtor  = FN_PTR(Circle_dtor);
   pthis->print = FN_PTR(Circle_print);
 }
 void Circle_delete(Circle** pthis)
 {
   if(pthis && *pthis)
   {
     pthis->dtor();
     free(*pthis); *pthis = NULL;
   }
 }
 Circle* Circle_copy(Circle* c)
 {
   Circle* pthis = (Circle*) malloc( sizeof( Circle ) );
   memcpy(pthis, c, sizeof( Circle ) );
   pthis->dtor  = FN_PTR(Circle_dtor);
   pthis->print = FN_PTR(Circle_print);
   return pthis;
 }
 int Circle_getX(Circle* pthis) { return pthis->x; }
 int Circle_getY(Circle* pthis) { return pthis->y; }
 int Circle_getR(Circle* pthis) { return pthis->r; }
 int Circle_setX(Circle* pthis, int x0) { pthis->x = x0; }
 int Circle_setY(Circle* pthis, int y0) { pthis->y = y0; }
 int Circle_setR(Circle* pthis, int r0) { pthis->r = r0; }
 void Circle_print() { printf("Circle\n"); }
 void Circle_dtor() {}
 int main()
 {
    Point* p = Point_new0();
    Point* c = (Point*)Circle_new0();
    p->print();
    c->print();     
    return 0;
 }

C++

Compiler: GCC, Visual C++, BCC, Watcom

 class Point
 {
   protected:
     int x, y;
   public:
     Point(int x0 = 0, int y0 = 0) : x(x0), y(y0) {}
     Point(const Point& p) : x(p.x), y(p.y) {}
     virtual ~Point() {}
     const Point& operator=(const Point& p)
     {
       if(this != &p)
       {
         x = p.x;
         y = p.y;
       }
       return *this;
     }
     int getX() { return x; }
     int getY() { return y; }
     int setX(int x0) { x = x0; }
     int setY(int y0) { y = y0; }
     virtual void print() { printf("Point\n"); }
 };
 class Circle : public Point
 {
   private:
     int r;
   public:
     Circle(Point p, int r0 = 0) : Point(p), r(r0) {}
     Circle(int x0 = 0, int y0 = 0, int r0 = 0) : Point(x0, y0), r(r0) {}
     virtual ~Circle() {}
     const Circle& operator=(const Circle& c)
     {
       if(this != &c)
       {
         x = c.x;
         y = c.y;
         r = c.r;
       }
       return *this;
     }
     int getR() { return r; }
     int setR(int r0) { r = r0; }
     virtual void print() { printf("Circle\n"); }
 };

C#


D

Compiler: DMD,GDC

Forth

Fortran

Java


JavaScript


Perl

Interpeter: Perl


PHP