// 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);
}
*/

最新文章

  1. 【iOS】在Swift中使用JSONModel
  2. 10.6 CCPC northeast
  3. javaWeb---文件上传(commons-FileUpload组件)
  4. HTTP 错误 500.19 - Internal Server Error(Windows Server 2012)
  5. 算法:最大子数组own
  6. 无法访问Fedora的samba共享
  7. 引擎设计跟踪(九.10) Max插件更新,地形问题备忘
  8. HDU 4927 大数运算
  9. 调色板QPalette类用法详解(附实例、源码)(很清楚:窗口背景色 前景色 按钮的颜色 按钮文本的颜色 )
  10. Java多线程总结之由synchronized说开去(转)
  11. 由于问题引起信号ORA-27154无法启动数据库
  12. HTTP协议 HttpWebRequest和 Socket的一点总结
  13. 详解Centos默认磁盘分区
  14. JavaScript中的私有成员[翻译]
  15. 三类设计模式UML图
  16. Paper | 学习多任务中的最佳分/ 合结构(十字绣结构)
  17. luogu p1652 圆
  18. [POI2012]STU-Well(二分答案+神仙操作)
  19. 省选前的th题
  20. 虚拟机中安装MAC OS X教程(适用所有电脑方法,特别是cpu不支持硬件虚拟化的电脑)

热门文章

  1. 什么类型网站不利于seo优化
  2. Apache Pulsar 社区周报:08-08 ~ 08-14
  3. 双击Back退出应用 android中弹出吐司
  4. ract-native常用命令
  5. HDU - 5775-Bubble Sort(权值线段树)
  6. ZOJ-2972-Hurdles of 110m(记忆化搜索)
  7. java初探(1)之缓存技术
  8. java-介绍函数理解重载
  9. PHP + Redis 生成自定义订单编号
  10. 关于在异步操作中访问React事件对象的小问题