当前位置: 首页 > 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.dtcms.com/a/122528.html

相关文章:

  • vue、vue2、vue3
  • mamba学习1
  • 蓝桥杯填空题攻克
  • 【C++】二叉搜索树(二叉查找树、二叉排序树)详解
  • Go 微服务框架 | 路由实现
  • 【BFT帝国】20250409更新PBFT总结
  • idea手动创建resources文件夹
  • checkra1n越狱出现的USB error -10问题解决
  • 面向数据库场景的大模型交互微调数据集
  • Flutter命令行打包打不出ipa报错
  • IDEA 2024 Maven 设置为全局本地仓库,避免新建项目重新配置maven
  • MySQL MVCC 机制详解
  • 大数据 - 1. 概述
  • 第一章初识爬虫
  • 【力扣hot100题】(079)划分字母区间
  • vue3.2 +vxetable4.6 渲染大数据列,出现错乱问题处理方案
  • BabelDOC ,开源的 AI PDF 翻译工具
  • 20250409-大数据-python数据处理平台/接口平台(DFF)
  • 基于cartographer 1.0.0 不使用ros 使用激光雷达数据和IMU数据融合实现的建图
  • Redis的Spring客户端的使用
  • Android系统深度定制:源码级拦截adb install的完整解决方案
  • Windows 11 家庭中文版 安装docker desktop 无法开启自启动问题处理
  • matlab内置的git软件版本管理功能
  • CSS AI 通义灵码 VSCode插件安装与功能详解
  • MySQL学习笔记十四
  • 安徽京准:NTP网络时钟服务器功能及同步模式的介绍
  • oracle将varchar2 转为clob类型存储。 oracle不支持直接使用sql,将 varchar2 到clob的类型转换,需要下面操作
  • Java + WebAssembly 2025:如何用Rust优化高性能Web应用?
  • proteus OLED12864仿真
  • centos 安装python3.9.9