打印
[uCOS/RTOS]

C语言实现多态

[复制链接]
2090|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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;
}
//-------------------------------------------------------------






多态.jpg (142 KB )

多态.jpg

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

384

帖子

5

粉丝