首页 > 其他分享 >如何用C语言实现多态?

如何用C语言实现多态?

时间:2023-07-08 22:32:12浏览次数:33  
标签:draw struct 多态 C语言 如何 Shape 基类 circle

多态(Polymorphism)是指面向对象程序运行时,相同的消息可能会送给多个不同的类之对象,系统依据对象所属类,引发对应类的方法,而有不同的行为。

简单来说,所谓多态意指相同的消息给予不同的对象会引发不同的动作。在C语言中,可以通过结构体和指针来实现多态。

以下是通过结构体和指针实现多态的简单示例代码:

#include <stdio.h>  
  
// 定义基类  
struct Shape {  
    void (*draw)(struct Shape*) ;  
} ;  
  
// 定义派生类  
struct Circle {  
    struct Shape shape;  
    int radius;  
} ;  
  
struct Rectangle {  
    struct Shape shape;  
    int width;  
    int height;  
} ;  
  
// 派生类的绘制函数  
void drawCircle(struct Circle *circle) {  
    printf("Drawing a circle...\n") ;  
}  
  
void drawRectangle(struct Rectangle *rectangle) {  
    printf("Drawing a rectangle...\n") ;  
}  
  
int main() {  
    // 创建派生类对象  
    struct Circle circle = { .draw = drawCircle, .radius = 10 };  
    struct Rectangle rectangle = { .draw = drawRectangle, .width = 20, .height = 30 };  
  
    // 调用基类的绘制函数  
    circle.draw(&circle);  
    rectangle.draw(&rectangle);  
  
    return 0;  
}

在上面的示例中,我们定义了一个 Shape 结构体作为基类,它包含一个指向 draw 函数的指针。我们还定义了两个派生类 Circle 和 Rectangle,它们都包含了一个继承自基类的 Shape 结构体。

在派生类中,我们实现了各自的绘制函数 drawCircle 和 drawRectangle。在 main 函数中,我们创建了 Circle 和 Rectangle 的对象,并将它们传递给基类的绘制函数 draw。由于指向基类的指针可以指向派生类的对象,因此这种多态就实现了。

在运行时,程序会分别输出 "Drawing a circle..." 和 "Drawing a rectangle...",这表明不同的对象调用了不同的绘制函数。

标签:draw,struct,多态,C语言,如何,Shape,基类,circle
From: https://blog.51cto.com/daniusdk/6663836

相关文章

  • 2023-07-08:RabbitMQ如何做到消息不丢失?
    2023-07-08:RabbitMQ如何做到消息不丢失?答案2023-07-08:1.持久化发送消息时设置delivery_mode属性为2,使消息被持久化保存到磁盘,即使RabbitMQ服务器宕机也能保证消息不丢失。同时,创建队列时设置durable属性为True,以确保队列也被持久化保存。2.确认机制消费者通过basic.ack命令向......
  • 用PPT画线时,如何取消自动选点(自动吸附点)? 按Alt键
    用PPT画线时,如何取消自动选点(自动吸附点)? 在用PPT画图时,如果画了两个小正方形,然后再画一条线连接两个小正方形,那么系统会自动选择这两个小正方形四边中点。如何取消这种自动吸附的设置,使我可以随意选择把线的端点定位在小正方形的任意位置?我们在设计编辑PPT时,有时候需要进行......
  • js 如何使用 join() 方法将数组的所有元素组成一个字符串。
    <html><body><scripttype="text/javascript">vararr=newArray(3);arr[0]="George"arr[1]="John"arr[2]="Thomas"document.write(arr.join());document.write("<br/>&q......
  • 痛苦了好几年,终于知道如何与孩子相处
    经历了好几年的争吵与对抗,我们夫妻俩不知道如何与孩子相处,情况刚好是我们最不愿意看到的那样:总是一谈就是学习,一问就是成绩,一聊就紧张,每场的沟通都以怒气谢幕。痛苦、煎熬伴着我们仨。现在,我们仨得救了。孩子成绩没有下降,我们相处得开心,融洽,自在。建立了良好的亲子关系。家里就像......
  • 如何在 Mac OS X 下制作可以在 PC 上启动的PE系统?
    如何在MacOSX下制作可以在PC上启动的PE系统?(zhihu.com)(84条消息)如何在MacOSX下制作可以在PC上启动的PE系统?-知乎(zhihu.com)如何在macOS下制作winpe启动U盘-老吴黑苹果工作室(hpglw.com)......
  • 广州H5开发如何提高用户留存率?
    随着当今互联网的发展,广州H5开发已经成为吸引用户的其中一个重要手段。但是仅仅只靠一个吸引人的H5页面来吸引用户访问是远远不够的,关键在于广州H5开发如何提高用户留存率,因此可以在设计开发的过程中采取一些策略和技巧。接下来,名锐讯动MRT将带大家探讨一些有效的广州H5开发的策略......
  • 如何快速删除node_modules
    1.windows11操作系统 回到桌面--》右击任务管理器--》运行新任务-  2.--》勾选以管理员身份运行cmd命令 3.--》删除命令帮助helprd  4.删除命令  rd/s/q 盘符:\某个文件夹 如:rd/s/q  E:\webProject\node_modules 这是高危险命令,直接从磁盘上删除当......
  • vscode 远程 开发 centos7 c语言
    本地vscode,搭建centos7的c语言开发环境远程主机一台或本地虚拟主机一台;本地电脑需要安装vscode的软件,vscode下载链接;vscode需要安装remote-ssh插件*vscode的debug参考文档远程主机安装gccyuminstall-ygccgdb查看gcc是否安装成功,gcc-vvscode用远程开发工具链接......
  • js 对象的键名如何设定成变量
    在JavaScript中,你可以使用以下两种方式将对象的键名设定为变量。使用计算属性名:使用方括号[]语法来动态设置对象的键名。你可以将变量放在方括号内作为键名。示例代码如下:constkey='name';constvalue='Alice';constobj={[key]:value};console.log(ob......
  • Wordpress:如何更改Elementor绑定的网站?
    在使用Wordpress做网站的过程中,需要用到Elementor付费版进行优化网站,一般是绑定一个网站后,要想新建另一个网站,基础版不支持多个绑定,那么如何进行改绑呢?1.进入Elementor后台,选择Subscriptions >>>选择已绑定的项,点击右下角ManageThissubscription  2.点击网站后面的锁......