Polymorphism: Difference between revisions
Content added Content deleted
(→[[C]]) |
(→[[C]]) |
||
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 (* |
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 |
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 |
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
Polymorphism
You are encouraged to solve this task according to the task description, using any language you may know.
You are encouraged to solve this task according to the task description, using any language you may know.
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
Forth
Fortran
Java
JavaScript
Perl
Interpeter: Perl