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 ...
随机推荐
- Vue根据条件添加 click 事件
方式一:在绑定事件中直接添加标示量clickFlag <div @click="clickFlag && addGoodsHandler()"> XXX ...
- sha1sum校验方法
sha1sum校验方法,我们可以保存到一个文件中.还可以根据已经得到的hash来确认文件.MD5类似. [root@ffcs211 test_dir]# sha1sum New.EXE 3fe44e8 ...
- Android Studio或者Eclipse中的最常用的快捷键,最简单的,部分不适用eclipse
重写方法:ctrl+shift+s 然后选择Generate 构建即可: 执行程序:shift+F10 多行注释:ctrl+shift+/ 单行注释:ctrl+/ 快速打印log:logr 快速复制 ...
- 只有一重循环的排序——侏儒排序(Gnome Sort)
侏儒排序:从头(i=0)开始遍历元素,如果当前元素比前一个元素大(array[i]>array[i-1]),就把它跟前一个元素互换(Swap(a[i],a[i-1]))并继续检查它(i--),否 ...
- java 检查进程是否存在
以nginx进程为例子 private final static String NAME_STRING = "nginx.exe"; //传入进程名称processName pub ...
- 说说ERP软件的系统设计--开源软件诞生8
赤龙ERP系统设计篇--第8篇 用日志记录"开源软件"的诞生 赤龙 ERP 开源地址: 点亮星标,感谢支持,与开发者交流 kzca2000 码云:https://gitee.com ...
- centos7使用Minikube“快速搭建“出Kubernetes本地实验环境(踩坑集锦及解决方案)
先决条件(先假设你做完这两步骤) 检查Linux是否支持虚拟化,验证输出是否为非空如何开启虚拟化 grep -E --color 'vmx|svm' /proc/cpuinfo 安装 kubectl ...
- Linux 【Shell脚本经典案例】
Shell 简介 hell是linux的一外壳,它包在linux内核的外面,为用户和内核之间的交互提供了一个接口 当用户下达指令给操作系统的时候,实际上是把指令告诉shell,经过shell解释,处理 ...
- Windows10 安装 CUDA + cuDNN + pyTorch
2020/5/29 在 windows10 上面安装 CUDA 和 cuDNN 0.简单了解一下 CUDA 和 cuDNN 1)什么是 CUDA CUDA(ComputeUnified Device ...
- 腾讯云COS对象存储 Web 端直传实践(JAVA实现)
使用 腾讯云COS对象存储做第三方存储云服务,把一些文件都放在上面,这里主要有三中实现方式:第一种就是在控制台去设置好,直接上传文件.第二种就是走服务端,上传文件,就是说,上传文件是从服务端去上传上去 ...