tags: [source-summary] type: source source: "C语言OOP封装完整系列 (B站视频课程)" author: "500强11年嵌入式工程师" date: 2026-05-05 url: ""
原始资料:
raw/Joplin/嵌入式+Linux/C语言OOP封装完整系列/,包含 PDF 笔记、PPTX 和 DOCX 三份文件。 主题:用纯 C 语言实现面向对象编程的封装、继承、多态三大特性,最终构建嵌入式四层架构。
整个系列从一个 LED 驱动出发,逐步演化出完整的 C-OOP 架构:
原始重复代码
→ struct 封装(数据结构化)
→ static 信息隐藏(模块内聚)
→ 头文件/源文件分离(接口与实现隔离)
→ 模块前缀规范(命名空间模拟)
→ init/deinit 生命周期(构造函数/析构函数模拟)
→ 基类嵌套(继承模拟)
→ 函数指针传参(策略模式)
→ ops 操作表(虚函数表模拟)
→ vptr 嵌入对象(多态就绪)
→ container_of 向下转型
→ 四层架构(基类/子类/板级绑定/应用)
→ module_init 自动注册(Linux 内核风格)
| 知识点 | 核心作用 | 对应 C 语法/模式 |
|---|---|---|
| 封装 | 数据+操作绑定,隐藏实现细节 | struct 组织数据,static 限制作用域 |
| 继承 | 复用公共字段和行为 | 基类 struct 作为子类第一个成员嵌套 |
| 多态 | 同一接口不同实现 | 函数指针 void (*on)(base*) + vtable |
| 信息隐藏 | 阻止外部直接访问数据 | static 函数+变量,头文件只暴露接口 |
| 命名空间 | 避免符号冲突 | 模块前缀 led_、gpio_ |
| 生命周期 | 规范化初始化和清理 | init() / deinit() 配对 |
| 向上转型 | 子类指针→基类指针 | 直接取 &obj.base |
| 向下转型 | 基类指针→子类指针 | container_of 宏 |
| 虚函数表 | 运行时多态调度 | struct LedOps 存函数指针 + 对象内嵌 ops* |
| 纯虚函数 | 强制子类实现 | assert(me->ops->on != NULL) |
| 延迟绑定 | 运行时决定调用哪个函数 | 函数指针赋值 + 间接调用 |
| 自动注册 | 模块无需修改主函数 | __attribute__((section())) + 链接脚本 |
第1层: led_base.h/c — 基类 (name, state, ops*)
第2层: led_gpio.c/pwm.c — 子类实现 (嵌套 base + 私有数据)
第3层: board_init.c — 板级绑定 (实例化+初始化+暴露全局指针)
第4层: app.c — 应用层 (只通过全局指针操作)
struct file_operations = LedOps(操作表)container_of = 向下转型宏module_init = __attribute__((section(".initcall6.init")))i2c_algorithm = 协议层 opsgpio_chip = 硬件抽象 ops// 计算成员在结构体中的偏移量(字节数)
#define offsetof(TYPE, MEMBER) ((size_t)&((TYPE *)0)->MEMBER)
// 从成员指针反推结构体指针
#define container_of(ptr, type, member) ({ \
void *__mptr = (void *)(ptr); \
((type *)(__mptr - offsetof(type, member))); })
raw/Joplin/嵌入式+Linux/C语言OOP封装完整系列/c-oop.md — 完整指南