// 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的更多相关文章

  1. RT Thread 通过ENV来配置SFUD,操作SPI Flash

    本实验基于正点原子stm32f4探索者板子 请移步我的RT Thread论坛帖子. https://www.rt-thread.org/qa/forum.php?mod=viewthread& ...

  2. STM32 + RT Thread OS 学习笔记[二]

    串口通讯例程 通过上面的练习,对STM32项目开发有了一个直观印象,接下来尝试对串口RS232进行操作. 1.   目标需求: 开机打开串口1,侦听上位机(使用电脑串口测试软件)发送的信息,然后原样输 ...

  3. STM32 + RT Thread OS 串口通讯

    1.   创建项目 a)   禁用Finsh和console b)   默认情况下,项目文件包含了finsh,它使用COM1来通讯,另外,console输出(rt_kprintf)也使用了COM1.因 ...

  4. STM32 + RT Thread OS 学习笔记[三]

    RTGUI 据说RTGUI是多线程的,因此与RT-Thread OS的耦合度较高,有可能要访问RT-Thread的线程控制块.如果要移植到其它OS,估计难度较大.目前还处于Alpha状态,最终将会包含 ...

  5. STM32 + RT Thread OS 学习笔记[四]

    1.  补注 a)      硬件,打通通讯通道 若学习者购买了学习板,通常可以在学习板提供的示例代码中找到LCD的相关驱动代码,基本上,这里的驱动的所有代码都可以从里面找到. 从上面的示意图可见,M ...

  6. RT thread 设备驱动组件之USART设备

    本文以stm32f4xx平台介绍串口驱动,主要目的是:1.RTT中如何编写中断处理程序:2.如何编写RTT设备驱动接口代码:3.了解串行设备的常见处理机制.所涉及的主要源码文件有:驱动框架文件(usa ...

  7. RT Thread的SPI设备驱动框架的使用以及内部机制分析

    注释:这是19年初的博客,写得很一般,理解不到位也不全面.19年末得空时又重新看了RTThread的SPI和GPIO,这次理解得比较深刻.有时间时再整理上传. -------------------- ...

  8. RT Thread SPI设备 使用

    后记: 之前,我把SPI的片选在Cubemx中配置成了SPI_NSS.现在我给它改为了GPIO_OUTPUT.  同时参考了别人的类似的一个操作无线模块(采用SPI设备驱动)的例子程序(清楚了RTT的 ...

  9. 优先级反转实验,使用信号量实现【RT-Thread学习笔记 5】

    RTOS中很经典的问题.就是在使用共享资源的时候,优先级低的进程在优先级高的进程之前执行的问题.这里模拟这种情况. 下面的实验模拟了优先级反转的情况: 先定义三个线程: //优先级反转实验 rt_se ...

随机推荐

  1. 通过Tomcat jpress连接不到数据库

    -- 实际数据库.用户名,密码,主机账号,端口号均正确 提示如下: 异常如下:------------------------------------------------------------- ...

  2. 项目介入EF Core

    目前.Net主流的ORM有SqlSugar.Entity Framework.Dapper,其它的我就不列举了.其实和Java那边ibatis相比,他们都比较轻量.之前用ibatis开发,真的很麻烦, ...

  3. 06.深入学习redis replication的完整流程和原理

    一.replication的完整流程 slave配置master ip和port # slaveof <masterip> <masterport> slaveof 127.0 ...

  4. 8点了解Java服务端单元测试

    一. 前言 单元测试并不只是为了验证你当前所写的代码是否存在问题,更为重要的是它可以很大程度的保障日后因业务变更.修复Bug或重构等引起的代码变更而导致(或新增)的风险. 同时将单元测试提前到编写正式 ...

  5. 使用jQuery设置和获取css样式

  6. php的负整数和正整数相加(负数以补码的形式存在内存,正数以原码的形式存在内存)

    首先先理解原码,反码,补码 十进制为例 原码: 5的原码:00000101 反码:11111010 补码:补码在末尾加1即   11111011  (正数的补码就是其负数,即5的补码就是-5) 正数在 ...

  7. Docker 私有镜像仓库的搭建及认证

    DockerHub 为我们提供了很多官方镜像和个人上传的镜像,我们可以下载机构或个人提供的镜像,也可以上传我们自己的本地镜像,但缺点是: 由于网络的原因,从 DockerHub 下载和上传镜像速度可能 ...

  8. 重要bug记录

    导唱功能:需求点分析:本地已下载歌曲播放,判断是否有音频原唱伴奏版权,无版权按钮显示“导唱”,有版权显示“播原唱”.程序实现逻辑: 1.下载歌曲时调用一个歌曲信息接口,返回歌曲的一些属性信息,其中包括 ...

  9. MD5截断比较验证 - 补充

    继上篇MD5截断比较验证文章之后有朋友提示除了数字以外,许多字母数字混合的明文在MD5加密之后也是可以达到同样效果的 同时在De1CTF中Web4题目中遇到了另一种较为特殊的截断比较验证,如图所示: ...

  10. 测试JsonAnalyzer2的12个测试用例:

    测试用例如下: 01. Compact json text={"status":"","message":"success&quo ...