揭开虚函数的面纱

揭开虚函数的面纱 自实现虚函数#include stdio.h #include stdlib.h struct Animal; typedef struct Dog DOG_S; typedef struct AnimalTable { void(*speak)(struct Animal *self); void(*eat)(struct Animal *self); } AnimalTable_S; typedef struct Animal { const AnimalTable_S *vtbl_base; char name[32]; } ANIMAL_S; static void animal_speak(struct Animal *obj_self) { printf(who : %s, speak \n, obj_self-name); } static void (animal_eat) (struct Animal *obj_self) { printf(who : %s, Eat \n, obj_self-name); } static const AnimalTable_S animal_table { .speak animal_speak, .eat animal_eat }; void animalCtor(ANIMAL_S *ptr_this) { ptr_this-vtbl_base animal_table; snprintf(ptr_this-name, sizeof(ptr_this-name), %s, animal); } typedef struct Dog { ANIMAL_S base; int dog_action; } DOG_S; static void dog_speak(struct Animal *obj_self) { DOG_S *dog (DOG_S *)obj_self; printf(who : %s, speak : %d \n, obj_self-name, dog-dog_action); } static void dog_eat(struct Animal *obj_self) { printf(who : %s, Eat \n, obj_self-name); } static const AnimalTable_S dog_child_table { .speak dog_speak, .eat dog_eat }; void dogCtor(DOG_S *ptr_this) { ptr_this-base.vtbl_base dog_child_table; snprintf(ptr_this-base.name, sizeof(ptr_this-base.name), %s, Dog); ptr_this-dog_action 100; } inline const AnimalTable_S *doPtr(ANIMAL_S *obj) { return obj-vtbl_base; } int main() { ANIMAL_S *animal; DOG_S dog; dogCtor(dog); animal (ANIMAL_S *)dog; doPtr(animal)-speak((ANIMAL_S *)dog); dog_eat((ANIMAL_S *)dog); }