C 多态 RT-Thread
// RT-Thread对象模型采用结构封装中使用指针的形式达到面向对象中多态的效果,例如:
// 抽象父类 #include <stdio.h>
#include <assert.h>
struct parent
{
int a;
//反映不同类别属性的方法
void (*vfunc)(int a);
}; // 继承自parent的子类
struct child
{
struct parent p;
int b;
}; // 父类的方法调用
void parent_vfunc(struct parent *self, int a)
{
assert(self != NULL);
assert(self->vfunc != NULL);
// 调用对象本身的虚拟函数
self->vfunc(a);
} // 父类的虚函数实现
static void Parent_FuncAction(int a)
{
printf(" Father 父对象动作 传入的参数 = %d \n", a);
} // 父类的构造函数
void parent_init(struct parent* self)
{
self->vfunc = Parent_FuncAction;
} // 子类的方法调用
void child_vfunc(struct child *self, int a)
{
struct parent* parent;
// 强制类型转换获得父类指针
parent = (struct parent*) self;
assert(parent != NULL); parent->vfunc(a);
} // 子类的虚函数实现
static void Child_FuncAction(int a)
{
printf(" Son 子对象动作 传入的参数 = %d \n", a);
} // 子类的构造函数
void child_init(struct child* self)
{
struct parent* parent; // 强制类型转换获得父类指针
parent = (struct parent*) self;
assert(parent != NULL); // 设置子类的虚拟函数
parent->vfunc = Child_FuncAction; // 多态要求父类和子类的具有多态关系的函数之间的函数名和签名保持一致。
// 从这里的写法,也可以看出来。
} int main()
{
// 这里可以结合RT Thread 的PIN 设备驱动,
// 掌握其是如何使用这些概念的,以便:1提高C语言的运用能力 、2有利于深入理解RT Thread等面向对象思想。
//一:
struct parent Parent;
struct child Child; parent_init(&Parent);
parent_vfunc(&Parent, 88); // 看第一个形参,是struct parent*。传入的对象是Parent。
// 有点父类指针指向父类对象的意思。
child_init(&Child); // 子类先初始化
parent_vfunc( (struct parent*)(&Child), 88); // 看第一个形参,这里有点父类指针指向子类对象的意思。
// 上面两段代码的效果:同一个函数被调用,传入不同的形参,达到不同的效果。这就达到了C语言实现多态的目的。 //二:
child_vfunc(&Child, 66);
child_vfunc((struct child*)&Parent, 66); printf("\n\t hello \n\n");
}
// 缺点:上述代码,子类对象无法调用父类的方法。
// 因为子类对象在构造的时候,子类的方法是覆盖式重写父类的方法的。所以也就不存在父类的方法一说了。
// 如果子类声明如下,那么子类对象就能同时保持父类和子类的方法。
//struct child
//{
//struct parent p; 父类本身有自己的方法。
//void (*vfunc)(int a); 这是专属于子类的方法。 <== 同时保持父类和子类的方法。
//int b;
//}; /*
// C 多态 一角,展示的一个 小例子
typedef struct ClassCoreObj{
int a;
}ClassCoreObj; typedef struct ClassSon_{
ClassCoreObj Obj;
int a;
}ClassSon; int main(void)
{
int testValue; ClassCoreObj CoreObj = {88}; // ClassSon Son = {CoreObj, 99}; Error 编译报错
// 应该是son.obj.a=coreobj的时候出的错,编译器不知道要类型转换. ClassSon Son;
Son.Obj = CoreObj;
Son.a = 99; testValue = ((ClassCoreObj*)&Son)->a; // 访问父类的成员a
printf("testValue = %d \n", testValue); testValue = Son.a; // 访问子类的成员a
printf("testValue = %d \n", testValue);
}
*/
C 多态 RT-Thread的更多相关文章
- RT Thread 通过ENV来配置SFUD,操作SPI Flash
本实验基于正点原子stm32f4探索者板子 请移步我的RT Thread论坛帖子. https://www.rt-thread.org/qa/forum.php?mod=viewthread& ...
- STM32 + RT Thread OS 学习笔记[二]
串口通讯例程 通过上面的练习,对STM32项目开发有了一个直观印象,接下来尝试对串口RS232进行操作. 1. 目标需求: 开机打开串口1,侦听上位机(使用电脑串口测试软件)发送的信息,然后原样输 ...
- STM32 + RT Thread OS 串口通讯
1. 创建项目 a) 禁用Finsh和console b) 默认情况下,项目文件包含了finsh,它使用COM1来通讯,另外,console输出(rt_kprintf)也使用了COM1.因 ...
- STM32 + RT Thread OS 学习笔记[三]
RTGUI 据说RTGUI是多线程的,因此与RT-Thread OS的耦合度较高,有可能要访问RT-Thread的线程控制块.如果要移植到其它OS,估计难度较大.目前还处于Alpha状态,最终将会包含 ...
- STM32 + RT Thread OS 学习笔记[四]
1. 补注 a) 硬件,打通通讯通道 若学习者购买了学习板,通常可以在学习板提供的示例代码中找到LCD的相关驱动代码,基本上,这里的驱动的所有代码都可以从里面找到. 从上面的示意图可见,M ...
- RT thread 设备驱动组件之USART设备
本文以stm32f4xx平台介绍串口驱动,主要目的是:1.RTT中如何编写中断处理程序:2.如何编写RTT设备驱动接口代码:3.了解串行设备的常见处理机制.所涉及的主要源码文件有:驱动框架文件(usa ...
- RT Thread的SPI设备驱动框架的使用以及内部机制分析
注释:这是19年初的博客,写得很一般,理解不到位也不全面.19年末得空时又重新看了RTThread的SPI和GPIO,这次理解得比较深刻.有时间时再整理上传. -------------------- ...
- RT Thread SPI设备 使用
后记: 之前,我把SPI的片选在Cubemx中配置成了SPI_NSS.现在我给它改为了GPIO_OUTPUT. 同时参考了别人的类似的一个操作无线模块(采用SPI设备驱动)的例子程序(清楚了RTT的 ...
- 优先级反转实验,使用信号量实现【RT-Thread学习笔记 5】
RTOS中很经典的问题.就是在使用共享资源的时候,优先级低的进程在优先级高的进程之前执行的问题.这里模拟这种情况. 下面的实验模拟了优先级反转的情况: 先定义三个线程: //优先级反转实验 rt_se ...
随机推荐
- 关于Chrome浏览器自动同步的问题
Chrome浏览器是开发者最喜欢的浏览器,没有之一,那么公司办公和在家办公的话数据需要有一致性,这个时候就用到了浏览器的自动同步的功能 因为网络的问题,谷歌账户很难登录,基本需要VPN翻墙处理之后才能 ...
- 断言函数-RF
测试用例的目的是要验证一些操作否符合我们的预期结果,所以在测试用例中,断言函数是必不可少的一项.我们做的每一步操作都会有预期的结果,为了保证操作得到的结果符合预期,我们需要在测试用例中添加断言,来保证 ...
- python os库的使用方法 + 自动化安装第三方库脚本
一.os库基本介绍 os库提供通用的.基本的操作系统交互功能,包括windows.Mac os.linux os库是python标准库,包含几百个函数 常用路径操作.进程管理.环境参数等几类 路径操作 ...
- 面经手册 · 第8篇《LinkedList插入速度比ArrayList快?你确定吗?》
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 你以为考你个数据结构是要造火箭? 汽车75马力就够奔跑了,那你怎么还想要2.0涡轮+ ...
- Lua 5.3注册C++类相关API
int luaL_newmetatable (lua_State *L, const char *tname); 如果注册表中不存在名为tname的表,则在注册表中创建一个名为tname的表,并将这个 ...
- Redis6.0.6集群服务搭建
实现目标 一台主机上搭建3主3从高可用redis集群 环境 Linux :CentOS7 Redis : 6.0.6 准备工作 1.查看是否有安装wget命令,如果没有安装使用yum命令安装wgt命令 ...
- Spring-代理模式
代理模式 目录 代理模式 1. 代理模式的分类 2. 静态代理 1. 角色分析 2. 代码步骤 3. 代理的好处 4. 进一步理解 3. 动态代理 1. 角色分析 2. 对动态代理的两个关键类的理解 ...
- Python测试框架pytest命令行参数用法
在Shell执行pytest -h可以看到pytest的命令行参数有这10大类,共132个 序号 类别 中文名 包含命令行参数数量 1 positional arguments 形参 1 2 gene ...
- [SSM项目]二-项目设计和框架搭建
一 10个实体类 选择Integer 而不是int的原因 :当值为空时,int类型会自动为其初始化,这是我们不希望的. 二 配置Maven 目录结构: src/main/java:业务代码 src/m ...
- 必考算法之 Top K 问题
大家好,这里是<齐姐聊算法>系列之 Top K 问题. Top K 问题是面试中非常常考的算法题. 8 Leetcode 上这两题大同小异,这里以第一题为例. 题意: 给一组词,统计出现频 ...