如何在纯C中实现类、继承和多态(小白友好版)

基本实现原理

/* 通过结构体+函数指针模拟类 */
typedef struct {// 成员变量int x;  // 成员方法(函数指针)                  void (*print)(void* self);  
} MyClass;/* 成员函数实现 */
void my_print(void* self) {MyClass* obj = (MyClass*)self;printf("Value: %d\n", obj->x);
}/* 构造函数 */
MyClass* MyClass_create(int x) {MyClass* obj = malloc(sizeof(MyClass));obj->x = x;obj->print = my_print;  // 方法绑定return obj;
}

🔀 三种核心特性实现

1. 封装

// 头文件(.h)中只声明结构体指针
typedef struct HiddenClass HiddenClass;// 源文件(.c)中定义真实结构体
struct HiddenClass {int private_data;void (*public_method)(HiddenClass*);
};

2. 继承

/* 基类 */
typedef struct {int base_val;void (*base_method)();
} Base;/* 派生类 */
typedef struct {Base super;  // 包含基类实现继承int derived_val;
} Derived;

3. 多态

typedef struct {void (*speak)();
} Animal;void dog_speak() { printf("汪汪汪\n"); }
void cat_speak() { printf("喵喵喵\n"); }Animal dog = { .speak = dog_speak };
Animal cat = { .speak = cat_speak };

🧩 完整示例:图形系统

/* 基类:Shape */
typedef struct Shape Shape;
struct Shape {void (*draw)(Shape*);
};/* 派生类:Circle */
typedef struct {Shape parent;  // 继承int radius;
} Circle;void circle_draw(Shape* self) {Circle* c = (Circle*)self;printf("绘制半径%d的圆\n", c->radius);
}Circle* create_circle(int r) {Circle* c = malloc(sizeof(Circle));c->parent.draw = circle_draw;c->radius = r;return c;
}

备注

个人水平有限,有问题随时交流~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/81711.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

51单片机入门教程——每个音符对应的重装载值

前言 本教程基于B站江协科技课程进行个人学习整理,专为拥有C语言基础的零基础入门51单片机新手设计。既帮助解决因时间差导致的设备迭代调试难题,也助力新手快速掌握51单片机核心知识,实现从C语言理论到单片机实践应用的高效过渡 。

股票单因子的检验方法有哪些?

股票单因子的检验方法主要包括以下四类方法及相关指标: 一、统计指标检验 IC值分析法 定义:IC值(信息系数)衡量因子值与股票未来收益的相关性,包括两种计算方式: Normal IC:基于Pearson相关系数…

洛谷 P8606 [蓝桥杯 2013 国 B] 高僧斗法 博弈论

题目 传送门 P8606 [蓝桥杯 2013 国 B] 高僧斗法 - 洛谷 思路 这个题就比较考验博弈的基本题型和转换能力了; 这个题是nim博弈>阶梯博弈 再将小和尚的移动转化为阶梯上石子的移动:两个小和尚之间可以移动的距离,看做阶梯上的石子&…

《政治最后的日子》章节

政治与中世纪教会的类比性衰落 作者提出现代民族国家正重复中世纪教会的衰落轨迹: 两者均曾作为社会组织核心存在约5个世纪 晚期都成为生产力阻碍(中世纪教会税收负担/现代国家官僚低效) 末期均出现管理者普遍腐败与公众蔑视(…

微软开源推理模型:Phi-4-reasoning-plus

Phi-4-reasoning-plus 技术解读 一、模型概述 Phi-4-reasoning-plus 是微软研究院开发的一种前沿开源推理模型,基于 Phi-4 通过监督微调和强化学习进一步训练而成。该模型专注于高质量和高级推理能力的培养,旨在为小型高效模型提供强大的推理性能。其训…

文学与社会学是否只是在做解释的工作?

目录 一、文学:从抒情到解释的转变 (一)文学从来不只是“虚构” (二)文学的解释,是“经验的再组织” 二、社会学:用理论语言重写社会现实 (一)社会学的“科学化”与…

Flink基础整理

文章目录 前言1.Flink系统架构2.编程模型(API层次结构)3.DataSet和DataStream区别4.Flink的批流统一5.Flink的状态后端6.Flink有哪些状态类型7.Flink并行度前言 提示:下面是根据网络或AI整理: 1.Flink系统架构 用户在客户端提交作业(Job)到服务端。服务端为分布式的主从…

mq消息可靠性传送

mq消息传送 开启消息发布确认模式 def publish(self, message):"""发布消息(自动重连)"""for i in range(3):try:message_ json.dumps(message, ensure_asciiFalse)self.ensure_connection()# 开启 confirm 模式&#x…

【quantity】10 面积单位模块(area.rs)

一、源码 我们可以实现面积单位文件,包含k(千)、d(分)、c(厘)、m(毫)前缀的面积量。面积的基本单位是平方米(SquareMeter)。 以下是area.rs的实…

运算放大器的主要技术指标

运放(运算放大器)是一种基础电子器件,具有输入阻抗高、开环放大倍数大、输入端电流小、同相端与反相端电压几乎相等等特点。在选型时,需要考虑技术指标如输入失调电压、输入失调电压漂移、输入失调电流、共模抑制比、压摆率、建立…

Docker 服务搭建

💢欢迎来到张翊尘的开源技术站 💥开源如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 Docker 服务搭建在 Ubuntu 上安装 Docker更新软件…

CRM系统接入DeepSeek大模型应用场景方案

1. 项目背景与目标 在当前数字化转型的浪潮中,客户关系管理(CRM)系统已成为企业提升客户服务效率、优化销售流程的核心工具。然而,传统CRM系统普遍面临数据处理能力有限、客户洞察深度不足、响应效率低下等问题。例如&#xff0c…

步进电机中断函数解释

STM32 motor111.c 中 HAL_TIM_PeriodElapsedCallback 函数逐行解释 下面我们对 STM32 项目中 motor111.c 文件里的 HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) 函数进行逐行解析,帮助初学者理解每一行代码的作用。此函数是在定时器产生更新中断时被调…

什么是Linux中的systemd?

写在前面 为什么要回过头来复习linux的system的,最近在研究DELL EMC的PowerStore存储系统,其底层是基于CoreOS开发的,这套操作系统是基于Systemd来设计的。所以要深入了解PowerStore就必须对systemd做详细了解。 systemd 是一个用于 Linux …

Linux 环境下 Mysql 5.7 数据定期备份

目录 一、创建数据备份脚本二、查看备份日志三、数据库数据恢复 备份策略: 系统环境 openEuler 22.03 (LTS-SP4) 单机备份 每天凌晨2点,指定数据库表全量备份,只保留近7次备份数据 每次的脚本执行,将会记录执行结果到日志&#xf…

C 语言字符输入:掌握 getchar 和 scanf 的用法与陷阱

各类资料学习下载合集 ​​https://pan.quark.cn/s/8c91ccb5a474​​ C 语言字符输入:掌握 getchar 和 scanf 的用法与陷阱 你好!在 C 语言编程中,与用户进行交互最基本的方式就是通过标准输入和标准输出。我们之前探讨了如何使用 ​​printf​​ 和 ​​putchar​​ 进行…

【React】 Hooks useTransition 解析与性能优化实践

1.背景 useTransition 是 React 18 引入的一个并发模式下的 Hook,用于区分紧急和非紧急的状态更新,提升应用的响应性和用户体验;它可以管理 UI 中的过渡状态,特别是在处理长时间运行的状态更新时。它允许你将某些更新标记为“过渡”状态&…

蘑菇管理——AI与思维模型【94】

一、定义 蘑菇管理思维模型是一种形象地描述组织对待新员工或初入职场者的管理方式及相关现象的思维模型。它将新员工或初入职场者比作蘑菇,这些人在初期往往被置于阴暗的角落(不受重视的部门,或打杂跑腿的工作),浇上…

c++STL——set和map的使用

文章目录 set和map的使用set系列声名和定义默认成员函数迭代器set的增删查lower_bound和upper_boundInsert接口pair类 对于查找的另一种使用 set和multiset的区别 map系列声名和定义pair类的进一步介绍默认成员函数map的增删查map的数据修改map和multimap的差异 set和map的使用…

什么是DGI数据治理框架?

DGI数据治理框架是由数据治理研究所(Data Governance Institute, DGI)提出的一套系统性方法论,旨在帮助企业或组织建立有效的数据治理体系,确保数据资产的高质量管理、合规使用和价值释放。以下是关于DGI数据治理框架的核心内容&a…