当前位置: 首页 > news >正文

【设计模式】面向对象开发学习OOPC

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接口

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


http://www.mrgr.cn/news/97821.html

相关文章:

  • Apache Nifi安装与尝试
  • 研究嵌入式软件架构时遇到的初始化堆栈溢出问题
  • 3 版本控制:GitLab、Jenkins 工作流及分支开发模式实践
  • LeetCode Hot100 刷题笔记(2)—— 子串、普通数组、矩阵
  • 【回眸】Linux 内核 (十六) 之 多线程编程 下
  • 中间件-消息队列
  • C# 设置Excel中文本的对齐方式、换行、和旋转
  • 【HTML】纯前端网页小游戏-戳破彩泡
  • IDEA :物联网ThingsBoard-gateway配置,运行Python版本,连接thingsboard,接入 MQTT 设备
  • 以普通用户身份启动pure-ftpd服务端
  • js chrome 插件,下载微博视频
  • 蓝桥杯备赛学习笔记:高频考点与真题预测(C++/Java/python版)
  • 开源的7B参数OCR视觉大模型:RolmOCR
  • 【论文精读】Multi-scale Neighbourhood Feature Interaction Network
  • windows使用cmake安装openvdb-12.0.0库
  • IDEA遇到问题汇总
  • 【UE5】RTS游戏的框选功能+行军线效果实现
  • 机器学习之PCA主成分分析详解
  • 面试如何应用大模型
  • 算法训练之动态规划(一)