C++中多态实现是基于虚函数表实现的,每个具备多态性对象的内部都会有一个隐藏的虚函数表,虚函数表里面的函数指针指向具体的函数实现,可能是父类中的实现,或是子类重写了的方法。C语言没有天然的多态支持,但是按照C++的实现原理,也能写出多态特性的代码。
下面代码就是用C实现多态。结构体Animal中有两个函数指针,eat和drink。Cat结构体通过组合的方式包含Animal对象,此时,Cat结构体也间接获得了eat和drink方法,通过Cat结构体实现原本Animal里面的方法。创建一个Cat结构体指针,将该Cat结构体指针强转成Animal类型的指针,就可以直接调用Animal对象中的方法。
#include#include #include #include typedef struct Animal{ void (*eat)(void* this); void (*drink)(void* this); }Animal; typedef struct Cat{ Animal base; char name[16]; void (*say)(void* this); }Cat; void Say(void* this){ assert(this); Cat* cat = (Cat*)this; printf("I am %sn", cat->name); } void CatEat(void* this){ assert(this); Cat* cat = (Cat*)this; cat->say(cat); printf("I am eating.n"); } void CatDrink(void* this){ assert(this); Cat* cat = (Cat*)this; cat->say(cat); printf("I am drinking.n"); } Cat* CatConstruct(){ Cat* cat = calloc(1, sizeof(Cat)); strcpy(cat->name, "cat"); cat->say = Say; cat->base.drink = CatDrink; cat->base.eat = CatEat; return cat; } int main(){ Animal* animal = (Animal*)CatConstruct(); animal->eat(animal); animal->drink(animal); free(animal); return 0; }



