1. // RT-Thread对象模型采用结构封装中使用指针的形式达到面向对象中多态的效果,例如:
  2. // 抽象父类
  3.  
  4. #include <stdio.h>
  5. #include <assert.h>
  6. struct parent
  7. {
  8. int a;
  9. //反映不同类别属性的方法
  10. void (*vfunc)(int a);
  11. };
  12.  
  13. // 继承自parent的子类
  14. struct child
  15. {
  16. struct parent p;
  17. int b;
  18. };
  19.  
  20. // 父类的方法调用
  21. void parent_vfunc(struct parent *self, int a)
  22. {
  23. assert(self != NULL);
  24. assert(self->vfunc != NULL);
  25. // 调用对象本身的虚拟函数
  26. self->vfunc(a);
  27. }
  28.  
  29. // 父类的虚函数实现
  30. static void Parent_FuncAction(int a)
  31. {
  32. printf(" Father 父对象动作 传入的参数 = %d \n", a);
  33. }
  34.  
  35. // 父类的构造函数
  36. void parent_init(struct parent* self)
  37. {
  38. self->vfunc = Parent_FuncAction;
  39. }
  40.  
  41. // 子类的方法调用
  42. void child_vfunc(struct child *self, int a)
  43. {
  44. struct parent* parent;
  45. // 强制类型转换获得父类指针
  46. parent = (struct parent*) self;
  47. assert(parent != NULL);
  48.  
  49. parent->vfunc(a);
  50. }
  51.  
  52. // 子类的虚函数实现
  53. static void Child_FuncAction(int a)
  54. {
  55. printf(" Son 子对象动作 传入的参数 = %d \n", a);
  56. }
  57.  
  58. // 子类的构造函数
  59. void child_init(struct child* self)
  60. {
  61. struct parent* parent;
  62.  
  63. // 强制类型转换获得父类指针
  64. parent = (struct parent*) self;
  65. assert(parent != NULL);
  66.  
  67. // 设置子类的虚拟函数
  68. parent->vfunc = Child_FuncAction; // 多态要求父类和子类的具有多态关系的函数之间的函数名和签名保持一致。
  69. // 从这里的写法,也可以看出来。
  70. }
  71.  
  72. int main()
  73. {
  74. // 这里可以结合RT Thread 的PIN 设备驱动,
  75. // 掌握其是如何使用这些概念的,以便:1提高C语言的运用能力 、2有利于深入理解RT Thread等面向对象思想。
  76. //一:
  77. struct parent Parent;
  78. struct child Child;
  79.  
  80. parent_init(&Parent);
  81. parent_vfunc(&Parent, 88); // 看第一个形参,是struct parent*。传入的对象是Parent。
  82. // 有点父类指针指向父类对象的意思。
  83. child_init(&Child); // 子类先初始化
  84. parent_vfunc( (struct parent*)(&Child), 88); // 看第一个形参,这里有点父类指针指向子类对象的意思。
  85. // 上面两段代码的效果:同一个函数被调用,传入不同的形参,达到不同的效果。这就达到了C语言实现多态的目的。
  86.  
  87. //二:
  88. child_vfunc(&Child, 66);
  89. child_vfunc((struct child*)&Parent, 66);
  90.  
  91. printf("\n\t hello \n\n");
  92. }
  93. // 缺点:上述代码,子类对象无法调用父类的方法。
  94. // 因为子类对象在构造的时候,子类的方法是覆盖式重写父类的方法的。所以也就不存在父类的方法一说了。
  95. // 如果子类声明如下,那么子类对象就能同时保持父类和子类的方法。
  96. //struct child
  97. //{
  98. //struct parent p; 父类本身有自己的方法。
  99. //void (*vfunc)(int a); 这是专属于子类的方法。 <== 同时保持父类和子类的方法。
  100. //int b;
  101. //};
  102.  
  103. /*
  104. // C 多态 一角,展示的一个 小例子
  105. typedef struct ClassCoreObj{
  106. int a;
  107. }ClassCoreObj;
  108.  
  109. typedef struct ClassSon_{
  110. ClassCoreObj Obj;
  111. int a;
  112. }ClassSon;
  113.  
  114. int main(void)
  115. {
  116. int testValue;
  117.  
  118. ClassCoreObj CoreObj = {88};
  119.  
  120. // ClassSon Son = {CoreObj, 99}; Error 编译报错
  121. // 应该是son.obj.a=coreobj的时候出的错,编译器不知道要类型转换.
  122.  
  123. ClassSon Son;
  124. Son.Obj = CoreObj;
  125. Son.a = 99;
  126.  
  127. testValue = ((ClassCoreObj*)&Son)->a; // 访问父类的成员a
  128. printf("testValue = %d \n", testValue);
  129.  
  130. testValue = Son.a; // 访问子类的成员a
  131. printf("testValue = %d \n", testValue);
  132. }
  133. */

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. idea,git操作

    原文地址:https://blog.csdn.net/lzx2018/article/details/91414591 1新建分支 点击New Branch 2切换分支

  2. CentOS7系统使用rpm方式安装MySQL5.7

    参考:https://blog.csdn.net/wudinaniya/article/details/81094578 1.首先去mysql官网下载rpm包,一个是server包一个是client包 ...

  3. python练习 英文字符的鲁棒输入+数字的鲁棒输入

    鲁棒 = Robust 健壮 英文字符的鲁棒输入 描述 获得用户的任何可能输入,将其中的英文字符进行打印输出,程序不出现错误.‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪ ...

  4. 不要盲目使用新技术,说的就是你,JWT!

    其实我更想聊标题的前半部分,后半部分只是拉出来做典型的. 简历上写上一句,"热衷于学习新技术",孬管是不是真的,至少加分项是可以有的. 再看看标题,我是来搞笑的? 学习与使用,两回 ...

  5. 前端修仙之路---一、如何用gulp搭建一套web前端开发框架

    引言 相信从事web前端开发的朋友都知道,现在流行的Vue.AngularJS等框架中,它们都有独立的脚手架来创建项目,比如Vue有vue-cli,Angular有angula-cli.脚手架可以一键 ...

  6. react native 常用学习或查资料网址

    react-native facebook官网:http://facebook.github.io/react-native/中文网:http://reactnative.cn/ react 官网地址 ...

  7. 编程体系结构(02):Java异常体系

    本文源码:GitHub·点这里 || GitEE·点这里 一.异常简介 优秀的程序代码,都在追求高效,安全,和低错误率,但是程序中的异常是无法避免的,降低异常出现的频率是关键,异常出现如何处理是另一个 ...

  8. Java反射(一)

    什么是反射? 在程序的运行过程中,可以动态的创建对象. 反射的基石是什么? 字节码对象是反射的基石.字节码对象:Java类文件通过javac进行编译后生成的xxx.class文件,此文件由jvm加载至 ...

  9. 剑指 Offer 47. 礼物的最大价值

    题目描述 在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0).你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格.直到到达棋盘的右下角.给定一个棋盘及 ...

  10. basicInterpreter1.02 增加对for循环的支持

    源码下载:https://files.cnblogs.com/files/heyang78/basicInterpreter102-20200531-2.rar 输入: for x= to print ...