C++中多态实现是基于虚函数表实现的,每个具备多态性对象的内部都会有一个隐藏的虚函数表,虚函数表里面的函数指针指向具体的函数实现,可能是父类中的实现,或是子类重写了的方法。C语言没有天然的多态支持,但是按照C++的实现原理,也能写出多态特性的代码。 下面代码就是用C实现多态。结构体Animal中有两个函数指针,eat和drink。Cat结构体通过组合的方式包含Animal对象,此时,Cat结构体也间接获得了eat和drink方法,通过Cat结构体实现原本Animal里面的方法。创建一个Cat结构体指针,将该Cat结构体指针强转成Animal类型的指针,就可以直接调用Animal对象中的方法。
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
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 %s\n", 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;
}
|