代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef void (*draw_func)(void*);
struct Shape {
int x;
int y;
draw_func draw;
};
void Shape_draw(void* shape) {
printf("Drawing shape at (%d, %d)\n", ((struct Shape*)shape)->x, ((struct Shape*)shape)->y);
}
void Shape_move(void* shape, int x, int y) {
((struct Shape*)shape)->x += x;
((struct Shape*)shape)->y += y;
}
struct Circle {
struct Shape base;
int radius;
};
void Circle_draw(void* shape) {
printf("Drawing circle at (%d, %d) with radius %d\n", ((struct Circle*)shape)->base.x, ((struct Circle*)shape)->base.y, ((struct Circle*)shape)->radius);
}
void* Circle_create(int x, int y, int radius) {
struct Circle* circle = malloc(sizeof(struct Circle));
memset(circle, 0, sizeof(*circle));
circle->base.draw = &Circle_draw;
circle->base.x = x;
circle->base.y = y;
circle->radius = radius;
return circle;
}
void draw_all_shapes(void** shapes, int count) {
for (int i = 0; i < count; i++) {
((struct Shape*)shapes[i])->draw(shapes[i]);
}
}
int main(int argc, char **argv) {
void* shapes[2] = {
Circle_create(10, 10, 5),
malloc(sizeof(struct Shape)),
};
((struct Shape*)shapes[1])->draw = &Shape_draw;
((struct Shape*)shapes[1])->x = 20;
((struct Shape*)shapes[1])->y = 20;
draw_all_shapes(shapes, 2);
struct Circle* circle = Circle_create(30, 30, 10);
Shape_move(circle, 5, 5);
circle->base.draw(circle);
free(circle);
free(shapes[0]);
free(shapes[1]);
return 0;
}