#include #include #include enum clazz {A, B}; typedef struct PrintI { enum clazz id; void (*print)(void); } *PrintI; void printA(void) { printf("I'm an A\n"); } void printB(void) { printf("I'm a B\n"); } PrintI newA(void) { PrintI o = malloc(sizeof(struct PrintI)); o->id = A; o->print = printA; return o; } PrintI newB(void) { PrintI o = malloc(sizeof(struct PrintI)); o->id = B; o->print = printB; return o; } int main(int argc, char *argv[]) { PrintI o = NULL; if (argc == 2 && strcmp(argv[1], "A") == 0) { o = newA(); } else if (argc == 2 && strcmp(argv[1], "B") == 0) { o = newB(); } else { printf("Usage: ooc A or ooc B\n"); return 0; } o->print(); // dynamic dispatch! return 0; }