摘要

C 语言是一门经典的过程式编程语言,没有原生的类(Class)、对象(Object)语法,但在嵌入式开发、操作系统内核、驱动程序等对性能和底层控制要求极高的场景中,我们往往需要用 OOP 思想来组织代码。本文将结合实战代码,详细讲解如何用 C 语言的结构体、函数指针等特性,模拟 OOP 的三大核心特性:封装、多态、继承,并分享工程化开发中的最佳实践。


一、为什么要用 C 写 “面向对象”?

在很多人看来,“面向对象” 是 C++/Java/Python 的专利,但在以下场景中,用 C 模拟 OOP 是刚需:

  1. 性能敏感场景:C++ 的虚函数表、异常机制等会带来微小的额外开销,而 C 可以完全控制内存布局和执行流程。
  2. 底层开发:嵌入式 MCU、操作系统内核(如 Linux)、硬件驱动,通常只有 C 编译器可用。
  3. 遗留系统维护:很多大型 C 语言项目(如 SQLite、FFmpeg)的代码中,都能看到 OOP 思想的影子。

二、核心特性 1:封装(Encapsulation)

封装的核心是 **“把数据和操作数据的方法绑在一起”,并隐藏内部实现细节。在 C 语言中,我们通过结构体 + 函数指针 ** 来实现。

1. 结构体设计:数据与方法的绑定

我们定义一个 “学生类”,不仅包含成绩数据,还包含 “打印自己” 的方法指针:

2. 初始化函数:构造函数的雏形

OOP 中对象创建时需要初始化,C 语言中我们手动写一个Init函数,完成三件事:

  1. 数据清零;
  2. 绑定默认方法(把函数指针指向具体函数);
  3. 安全检查(防止野指针)。


三、核心特性 2:多态(Polymorphism)

多态的核心是 **“同一接口,不同实现”。在 C 语言中,我们通过动态修改函数指针的指向 ** 来实现。1. 定义不同的 “自定义行为”

2. 主函数:动态绑定与调用


四、核心特性 3:继承(Inheritance)的模拟(进阶)

C 语言没有原生继承,但可以通过结构体嵌套来实现 “基类” 与 “派生类” 的关系。

原理:内存布局的兼容性

只要把 “基类结构体” 作为 “派生类结构体” 的第一个成员,它们的内存起始地址就是相同的,可以安全地进行指针类型转换。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐