函数指针 + 结构体 = C 语言的“对象模型”?——从 C 到 C++ / Java 的本质统一

一、为什么 C 语言“没有对象”,却处处是对象?

很多人说:

C 是面向过程,C++ / Java 是面向对象。

但你只要看过 Linux 内核、驱动、HAL、FFmpeg、libc,就会发现:

👉到处都是 struct + 函数指针。

比如经典结构:

typedef struct { void (*open)(void* self); void (*close)(void* self); } DeviceOps; typedef struct { DeviceOps* ops; int fd; } Device; void device_open(Device* d) { d->ops->open(d); }

这真的只是“面向过程”吗?

其实不是。
👉这是 C 语言手写的“对象模型”。

tips:对象模型”可以简单理解为:像 Java 里定义接口 → 写接口实现类 → 用实现类对象,通过接口去调用方法。

二、这段 C 代码,本质上已经具备 OOP 全套能力

上面这段代码已经同时具备:

  • ✅ 数据(fd)

  • ✅ 行为(open / close)

  • ✅ 接口抽象(DeviceOps)

  • ✅ 回调机制(函数指针)

  • ✅ 多态(ops 指向不同实现)

  • ✅ this/self 机制(void* self)

这在设计层面,已经是一个完整的“对象系统”。

三、逐项拆解:C 是如何“手搓 OOP”的

1️⃣ 接口(函数表)

typedef struct { void (*open)(void* self); void (*close)(void* self); } DeviceOps;

这本质就是:
👉接口 / 虚函数表 / 回调集合

2️⃣ 对象(数据 + 接口指针)

typedef struct { DeviceOps* ops; int fd; } Device;

等价于:

  • 成员变量
  • 虚函数表指针

3️⃣ 方法调用(多态)

d->ops->open(d);

这里发生了三件事:

  • 通过 ops 找接口
  • 通过接口找实现
  • 把 d 作为 self 传入

👉 这就是虚函数调用

四、翻译成 Java,会发生什么?

C 版本核心调用

d->ops->open(d);

Java 直译版

d.ops.open(d);

Java 正统面向对象写法

d.open();

因为:

  • C 需要你手动维护 self
  • Java 编译器 / 虚拟机帮你维护 this

Java 完整对应结构

接口(C 的 DeviceOps)
interface Device { void open(); void close(); }

实现类(某个具体设备)

class FileDevice implements Device { int fd; @Override public void open() { } }

多态调用

Device d = new FileDevice(); d.open();

👉 本质和 C 的:

d->ops->open(d);

完全一致。

五、翻译成 C++,你会看到“虚函数表真身”

class Device { public: virtual void open() = 0; virtual void close() = 0; int fd; };

编译器背后做的事情,和你在 C 里写的:

DeviceOps* ops;

几乎一模一样。

👉 C++ 只是帮你自动生成并维护了那张函数表。

六、函数指针模型 = 回调模型 = 对象模型

普通回调:

register_callback(on_event);

对象模型:

device->ops->on_event(device);

区别只有一个:

👉 对象模型 =一组有语义的回调 + 绑定的数据结构

这也是为什么系统层大量使用 struct + 函数指针:

  • Linux driver
  • Binder driver
  • HAL module
  • FFmpeg / libuv / libc

👉 全部都是“接口 + 实现 + 回调 + 多态”。

七、为什么系统层更爱 C 风格“对象模型”?

因为它:

  • ✅ ABI 稳定

  • ✅ 内存布局可控

  • ✅ 无运行时依赖

  • ✅ 跨语言

  • ✅ 性能可预测

  • ✅ 可用于内核 / 驱动 / 启动阶段

而 C++ / Java:

  • 是在此模型之上,提供自动化和安全封装。

八、一句话本质总结(系统工程师版)

👉 面向对象不是语法,是设计思想。
👉 C 用函数指针实现对象。
👉 C++ 用编译器实现对象。
👉 Java 用虚拟机实现对象。

九、对 NDK / Android 系统方向的意义

你以后会不断看到:

  • Binder 的 struct + ops

  • HAL 的 hw_module_t

  • Linux 的 file_operations

  • FFmpeg 的 AVCodec

你会发现:

👉它们全都是这一个模型。

当你真正理解“函数指针 + struct = 对象模型”,你就已经具备:

✅ 系统接口设计能力
✅ 框架层阅读能力
✅ 架构抽象能力

十、终极总结

C :手动对象系统
C++ :编译器对象系统
Java :虚拟机对象系统

底层实现不同,抽象思想完全统一。

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

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

相关文章

2022蓝帽杯计算机取证

[蓝帽杯 2022 初赛]计算机取证[蓝帽杯 2022 初赛]计算机取证_1现对一个windows计算机进行取证,请您对以下问题进行分析解答。 从内存镜像中获得taqi7的开机密码是多少?F:\QZBS\volatility_2.6_win64_standalone\volatility_2.6_win64_standalone\volatil…

Node.js用AsyncResource追踪异步操作

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 Node.js异步追踪的革命:深度解析AsyncResource的实战应用目录Node.js异步追踪的革命:深度解析AsyncResou…

1. 2025 年终总结 PPT 愁死人?这 3 款 AI

又到了年终总结的时候,职场人都在为制作一份高质量的年终总结 PPT 发愁。多少个夜晚,我们对着空白的 PPT 页面发呆,不知道该如何搭建框架,内容写得干巴巴,设计出来的 PPT 又毫无美观度可言。好不容易完成一份&#xff…

麻雀算法SSA 差分算法DE GA遗传算法的光伏阵列参数辨识附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和数学建模资料 &#x1f34…

【数据集】中国杰出青年名单数据集(1994-2024年)

数据简介:国家杰出青年科学基金是我国在基础研究领域为优秀青年学者提供的最高层级人才资助项目。该基金专项用于支持已取得显著科研成果的青年学者,资助其自主开展创新性研究工作,着力培养一批能够跻身世界科技前沿的学术领军人才。本数据集…

圆度误差的神经网络评定及测量不确定度研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和数学建模资料 &#x1f34…

【SCI创新】ASL-QPSO-SVM时序预测算法研究——基于动态非线性收缩扩张因子、正余弦惯性权重与莱维-贪婪融合策略附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…

数字员工如何通过AI销冠系统与AI提效软件系统推动企业智能化升级

数字员工在企业中扮演着愈发重要的角色,尤其是在优化业务流程和降低成本方面。通过引入AI销冠系统,数字员工不仅能够提升工作效率,还能有效减少企业在人工服务上的投入。例如,数字员工借助该系统可以实现全天候客户响应&#xff0…

数字员工是什么?AI销冠系统与AI提效软件系统的价值在哪里?

数字员工作为一种创新的AI销售工具,正逐渐成为企业优化业务流程和降低运营成本的重要手段。通过自动化处理各类销售任务,数字员工能够显著提升工作效率。AI销冠系统的引入,使得企业在客户沟通中更加高效。这个系统能够自主完成客户外呼、满意…

【SCI二区IEEE复现】基于混合有限集模型预测控制(FCS-MPC)的模块化多电平换流器(MMC)整流电路仿真模型附Simulink仿真

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…

Agent Skills (Claude Skills) 详细攻略,一篇文章精通

Agent Skills 最近非常的火,起初,它还只是 Claude 中一个小功能模块,就在最近两个月,越来越多的人觉得 Skills 非常的好用。所以 Codex、Cursor、Opencode 等 AI 编程工具,陆续加入了对 Agent Skills 的支持。 2025年1…

基于AHP-EWM正态云模型的初中地理教学评价附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 🍎 往期回顾关注个人主页:Matlab科研工作室 👇 关注我领取海量matlab电子书和数学建模资料 &#x1…

【SCI复现】高比例可再生能源并网如何平衡灵活性与储能成本?虚拟电厂多时间尺度调度及衰减建模附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 🍎 往期回顾关注个人主页:Matlab科研工作室 🍊个人信条:格物致知,完整Matlab代码及仿真…

【无人机追踪】基于Dubin和候选集的无人机UAV集群协同攻击目标的Matlab仿真程序,围绕无人机的目标搜索、冲突避免、联盟组建和任务执行展开考虑能和

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和数学建模资料 &#x1f34…

学长亲荐9个AI论文平台,研究生高效写作必备!

学长亲荐9个AI论文平台,研究生高效写作必备! AI 工具助力论文写作,高效与精准并存 在研究生阶段,论文写作是不可避免的挑战,而随着 AI 技术的不断进步,越来越多的工具开始融入学术研究中。AI 降重工具不仅能…

【SCI一区】【电动车】基于ADMM双层凸优化的燃料电池混合动力汽车研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…

Claude Code + Codex + Gemini 似乎已经成为高手总结的AI编程最佳实践方案

原帖来自x平台 雪踏乌云,但是这个观点,在x上不止一个AI大神提过,应该是已经成为真正AI编程玩家的共识,总结下: 1. Claude Code写代码主力 2. Codex修Bug,审模块功能主力 3. Gemini负责前端风格 1. Clau…

导师严选2026 AI论文网站TOP9:继续教育写作全攻略

导师严选2026 AI论文网站TOP9:继续教育写作全攻略 2026年AI论文写作工具测评:为何值得一看 在当前学术研究日益数字化的背景下,AI论文写作工具已成为高校师生、科研人员提升效率的重要助手。然而,面对市场上琳琅满目的选择&#x…

高精度智慧城市建筑物巡检识别 建筑物立面缺陷识别 墙面裂缝检测数据集 表面裂纹图像识别数据集 工程质量巡检图像数据集第10381期

数据集 README数据集核心信息表项目内容类别数量及名称5 类(裂缝、霉菌、剥落的油漆、阶梯状裂缝、渗水)数据数量1300 条数据集格式YOLO 格式核心应用价值1. 支撑建筑结构病害检测算法的训练与优化;2. 助力工程质量巡检的智能化升级&#xff…

【GA-HIDMSPSO-CNN-SVM】 基于 GA-HIDMSPSO 优化 CNN-SVM 分类研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…