#include <stdio.h> typedef struct { void (*draw)(void*); //虚函数 void (*rotate)(void*); }vtable; typedef struct { vtable *vptr; //虚表指针 }Shape; typedef struct { vtable *vptr; int x,y,w,h; }Rect; typedef struct { vtable *vptr; int x,y,r; }Cycle; void DrawRect( void *p ) { Rect *me = (Rect *)p; //............ printf( "DrawRect\n" ); } void RotateRect( void *p ) { Rect *me = (Rect *)p; //............ printf( "RotateRect\n" ); } void DrawCycle( void *p ) { Cycle *me = (Cycle *)p; //............ printf( "DrawCycle\n" ); } void RotateCycle( void *p ) { Cycle *me = (Cycle *)p; //............ printf( "RotateCycle\n" ); } vtable RectOpers = { &DrawRect, &RotateRect }; //虚函数表定义 vtable CycleOpers = { &DrawCycle, &RotateCycle }; int main() { Rect rt1 = { &RectOpers, 0, 0, 10, 10 }; //实体类的实现 Cycle cy1 = { &CycleOpers, 10, 10, 20 }; Shape *sh = (Shape *)&rt1; sh->vptr->draw(sh); sh->vptr->rotate(sh); sh = (Shape *)&cy1; sh->vptr->draw(sh); sh->vptr->rotate(sh); return 0; }
vtable 实现的是一个虚函数表。三个struct实现每一个第一个位置放的都是vtable,Shape为基类,只有一个vtable *vptr。
强制类型转换后,取每一个子类的第一个指针,也就是vtable所指的指针。
而vtable RectOpers = { &DrawRect, &RotateRect }; //虚函数表定义
vtable CycleOpers = { &DrawCycle, &RotateCycle };‘
已经初始化了指针的值,故而调用sharp 的时候,实质上是调用的已经赋值的指针。实现了虚函数的作用。