本帖最后由 andy520520 于 2021-8-17 09:45 编辑
多态是面向对象里面重要的要素,实现了接口的统一,本例实现了C模拟C++的封装、继承、多态等重要特性。
在C++里面实现多态是编译器自动完成建立类的虚表,这个虚表是存储虚函数指针的表格。
现在要在C里面实现多态就是要手动建立一个虚表。
如下:
先建立父类结构
typedef struct _person
{
struct person_v_table *vptr; // 建立一个虚表指针
char* name;
int age;
}person_t;
// 虚表结构
typedef struct person_v_table
{
void (*set_name)(person_t* p_obj, char* name);
char* (*get_name)(person_t* p_obj);
void (*set_age)(person_t* p_obj, int age);
int (*get_age)(person_t* p_obj);
void (*show_person)(person_t* p_obj);
}person_v_table_t;
// 子类结构
typedef struct _derived
{
person_t yiji; // 对父类的继承
char* sex;
char* address;
}derived_t;
// 函数声明
void set_name(person_t* p_obj, char* name);
char* get_name(person_t* p_obj);
void set_age(person_t* p_obj, int age);
int get_age(person_t* p_obj);
void show_person(person_t* p_obj);
// 构造函数,完成对类的初始化
void person_init(person_t* p_obj)
{
static person_v_table_t vtbl =
{
&set_name_x,
&get_name_x,
&set_age_x,
&get_age_x,
&show_person_x,
};
p_obj->vptr = &vtbl;
p_obj->name = NULL;
p_obj->age = 0;
}
void derived_init(derived_t* p_obj)
{
static person_v_table_t vtbl =
{
&set_name_x,
&get_name_x,
&set_age_x,
&get_age_x,
&show_person_y,
};
person_init(&p_obj->yiji);
p_obj->yiji.vptr = &vtbl;
p_obj->yiji.name = NULL;
p_obj->yiji.age = 0;
p_obj->sex = NULL;
p_obj->address = NULL;
}
//-------------------------------------------------------------
|