Jump to content

Polymorphism: Difference between revisions

Line 14:
 
'''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)
Line 24 ⟶ 26:
int x;
int y;
void (*printdtor)(); /* virtual */
void (*print)(); /* virtual */
} Point;
 
Line 31 ⟶ 34:
Point* pthis = (Point*) malloc( sizeof( Point ) );
memset(pthis, 0, sizeof( Point ) );
pthis->dtor = FN_PTR(Point_dtor);
pthis->print = FN_PTR(Point_print);
}
Line 39 ⟶ 43:
pthis->x = x0;
pthis->y = 0;
pthis->dtor = FN_PTR(Point_dtor);
pthis->print = FN_PTR(Point_print);
}
Line 47 ⟶ 52:
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;
}
}
 
Line 54 ⟶ 69:
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;
}
Line 62 ⟶ 79:
int Point_setY(Point* pthis, int y0) { pthis->y = y0; }
void Point_print() { printf("Point\n"); }
void Point_vprintPoint_dtor(Point* pthis) { pthis->print(); }
 
// Trick: This way Circle.x, Circle.y, Circle.r are available
Line 80 ⟶ 97:
Circle* pthis = (Circle*) malloc( sizeof( Circle ) );
memset(pthis, 0, sizeof( Circle ) );
pthis->dtor = FN_PTR(Circle_dtor);
pthis->print = FN_PTR(Circle_print);
}
Line 89 ⟶ 107:
pthis->y = 0;
pthis->r = 0;
pthis->dtor = FN_PTR(Circle_dtor);
pthis->print = FN_PTR(Circle_print);
}
Line 98 ⟶ 117:
pthis->y = y0;
pthis->r = 0;
pthis->dtor = FN_PTR(Circle_dtor);
pthis->print = FN_PTR(Circle_print);
}
Line 107 ⟶ 127:
pthis->y = y0;
pthis->r = r0;
pthis->dtor = FN_PTR(Circle_dtor);
pthis->print = FN_PTR(Circle_print);
}
Line 116 ⟶ 137:
pthis->y = p->y;
pthis->r = 0;
pthis->dtor = FN_PTR(Circle_dtor);
pthis->print = FN_PTR(Circle_print);
}
Line 125 ⟶ 147:
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;
}
}
 
Line 132 ⟶ 164:
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;
}
Line 142 ⟶ 176:
int Circle_setR(Circle* pthis, int r0) { pthis->r = r0; }
void Circle_print() { printf("Circle\n"); }
void Circle_vprintCircle_dtor(Circle* pthis) { pthis->print(); }
 
int main()
{
Point* p = Point_new0();
Point* c = (Point*)Circle_new0();
p->print();
c->print();
return 0;
}
 
==[[C plus plus|C++]]==
Anonymous user
Cookies help us deliver our services. By using our services, you agree to our use of cookies.