Polymorphism: Difference between revisions

From Rosetta Code
Content added Content deleted
Line 60: Line 60:
if(pthis && *pthis)
if(pthis && *pthis)
{
{
pthis->dtor();
(*pthis)->dtor();
free(*pthis); *pthis = NULL;
free(*pthis); *pthis = NULL;
}
}
Line 155: Line 155:
if(pthis && *pthis)
if(pthis && *pthis)
{
{
pthis->dtor();
(*pthis)->dtor();
free(*pthis); *pthis = NULL;
free(*pthis); *pthis = NULL;
}
}

Revision as of 05:09, 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"); }
 };
int main()
{
   Point* p = new Point();
   Point* c = new Circle();
   p->print();
   c->print();     
   return 0;
}

C#


D

Compiler: DMD,GDC

Forth

Fortran

Java

class Point
{
  protected int x, y;
  public Point() { this(0); }
  public Point(int x0) { this(x0,0); }
  public Point(int x0, int y0) { x = x0; y = y0; }
  public int getX() { return x; }
  public int getY() { return y; }
  public int setX(int x0) { x = x0; }
  public int setY(int y0) { y = y0; }
  public void print() { System.out.println("Point"); }
}
public class Circle extends Point
{
  private int r;
  public Circle(Point p) { this(p,0); }
  public Circle(Point p, int r0) { super(p); r = r0; }
  public Circle() { this(0); }
  public Circle(int x0) { this(x0,0); }
  public Circle(int x0, int y0) { this(x0,y0,0); }
  public Circle(int x0, int y0, int r0) { super(x0,y0); r = r0; }
  public int getR() { return r; }
  public int setR(int r0) { r = r0; }
  public void print() { System.out.println("Circle"); }
  public static void main(String args[])
  {
    Point p = new Point();
    Point c = new Circle();
    p.print();
    c.print();     
  }
}

JavaScript


Perl

Interpeter: Perl


PHP