PLOOC-裸机思维
PLOOC-git
OOPC精要——撩开“对象”的神秘面纱
C/C++面向对象编程之封装-KK
- 面向过程,本质是“顺序,循环,分支”
- 面向对象,本质是“继承,封装,多态”
- 参考的书籍:《UML+OOPC嵌入式C语言开发精讲》
其他相关
SimonQian
VSF
GMSI
裸机思维
傻孩子
simple_fsm
其他相关
LW-OOPC(高焕堂(台湾))
如何使用
参考 LW_OOPC宏配置及使用指南.md
是如何面向对象的?
继承-通过 结构体嵌套 模拟继承
基类成员放在子类结构体的开头,保证内存布局兼容。
子类可以访问基类成员,并扩展新的成员。
封装-结构体(struct)封装数据成员,并利用函数指针(function pointers)模拟方法
缺点是所有的成员和方法都是暴露的;
多态:通过统一的接口访问不同底层实现的能力
虚函数表(VTable):模拟 C++ 的虚函数机制
接口抽象:通过结构体指针实现接口的多态调用
方法重写:子类重新定义父类的虚函数
需要解决:如何在运行时决定调用哪个具体函数?
缺点
接口类(Interface)、抽象类(Abstract Class)和具体类(Concrete Class) 是三种不同的类类型
接口类(Interface)
特点:
纯抽象:只包含 抽象方法(无具体实现),不能有成员变量(C++/Java)或可以有静态常量(Java)。
多继承支持:一个类可以实现多个接口(弥补单继承的不足)。
强调行为契约:定义“能做什么”,不关心“如何做”。
无构造函数:不能被实例化
抽象类(Abstract Class)
特点:
部分抽象:可以包含 抽象方法(无实现)和 具体方法(有实现)。
可以有成员变量:普通字段或常量。
单继承限制:一个类只能继承一个抽象类。
不能实例化(没有new方法):必须由子类继承并实现抽象方法后使用。
具体类(Concrete Class)
特点:
完全实现:所有方法都有具体实现(无抽象方法)。
可直接实例化:通过 new 创建对象。
可继承抽象类或实现接口:必须实现所有继承的抽象方法。
比较
为什么需要FUNCTION_SETTING
实现了该类的创建、方法的动态绑定
作用是动态绑定方法到类的函数指针,而不是直接调用已实现的函数。这样做的主要目的是为了实现 多态(Polymorphism) 和 运行时方法绑定,从而让代码更加灵活、可扩展。
FUNCTION_SETTING 的作用是 把函数指针绑定到类的虚方法表(vtable),使得在运行时可以根据对象类型动态调用正确的方法。
使用动态的绑定,提供了修改父类方法的地方,
针对父类的方法,其参数还是父类的参数,Animal* t
子类的方法用了子类的参数
子类->父类
父类->子类
如果 Dog_move(接口方法)需要访问 Dog 类的成员变量
使用 SUB_PTR宏反向转换:
由于 Dog 实现了 IMoveable,可以通过结构体内存布局的偏移量,从 IMoveable* 转回 Dog*
/* Dog 的移动行为(需要访问 Dog 的成员变量) */
void Dog_move(IMoveable* t) {// 将 IMoveable* 转为 Dog*Dog* dog= SUB_PTR(t, Animal, Dog);// 现在可以访问 Dog 的成员变量Animal* animal = SUPER_PTR(dog, Animal);printf("狗[%s]在地上跑,年龄%d岁!\n", animal->name, animal->age);
}
内存泄漏(Memory Leak)
通常指由于面向对象编程模式在 C 语言中的特殊实现方式(如动态内存分配、对象生命周期管理不当)导致的内存未能正确释放的问题。
其他相关
金永华
Akagi201
Akagi201博客
关于-LW_OOPC学习01
基本概念回顾
抽象类Vs接口