栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言实现C++多态

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言实现C++多态

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;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/512747.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号