BREW中接口——C语言实现继承和多态
来源:互联网 发布:淘宝装修网店服务平台 编辑:程序博客网 时间:2024/06/08 01:55
2009-04-23 16:56
#include <stdio.h>#include <stdlib.h>#define GET_VTBL(p,type) ((type*)(void*)p)->vt //p必须有vt成员typedef struct _IBase IBase; //方便使用typedef struct _Base Base;struct _IBase {void (*Show)(IBase *p); //函数指针};struct _Base {IBase vt; //相当于虚函数表};void Base_Show(IBase *p) //函数定义{printf("This is Base_Show()\n");}void InitBase(Base **p) //初始化{*p = (Base*)malloc(sizeof(Base));(*p)->vt.Show = Base_Show;}#define IBASE_Show(p) GET_VTBL(p,Base).Show((IBase*)p); //方便使用typedef struct _IInherit IInherit; //派生类typedef struct _Inherit Inherit;struct _IInherit{void (*Show)(IBase *p); //注意:名称和顺序与基类相同void (*Show2)(IInherit *p); //派生函数};struct _Inherit{IInherit vt;int data;};void Inherit_Show(IBase *p) //派生类函数,改写基类函数{printf("This is Inherit_Show(), data=%d\n", ((Inherit*)p)->data);}void Inherit_Show2(IInherit *p) //派生类扩展函数{printf("This is Inherit_Show2(), data=%d\n", ((Inherit*)p)->data);}void InitInherit(Inherit **p) //初始化{*p = (Inherit*)malloc(sizeof(Inherit));(*p)->vt.Show = Inherit_Show;(*p)->vt.Show2 = Inherit_Show2;(*p)->data = 10;}#define IINHERIT_Show(p) GET_VTBL(p,Inherit).Show((IInherit*)p); //方便使用#define IINHERIT_Show2(p) GET_VTBL(p,Inherit).Show2((IInherit*)p);void main(){Base *p = 0;InitBase(&p); //初始化基类指针IBASE_Show(p);free(p);InitInherit((Inherit **)&p); //初始化派生类指针IBASE_Show(p); //以派生类实例调用基类接口,多态的关键IINHERIT_Show2((Inherit *)p); //调用派生类接口free(p);getchar(); //停一下,看看输出结果吧}
/*
输出结果如下:
This is Base_Show()
This is Inherit_Show(), data=10 //这一步,是多态的关键
This is Inherit_Show2(), data=10
总结:
1、如果结构体的成员是结构体,相当于成员结构体展开在新的结构体中,参数的顺序结构不变,这个是基础的基础。
2、使用函数指针调用函数,可以在运行时指向不同的函数,这个是多态的关键。(貌似这里并没有用到)
*/
- BREW中接口——C语言实现继承和多态
- BREW接口的继承和多态
- BREW接口的继承和多态
- BREW接口的继承和多态
- 关于C语言中继承和多态的实现
- 关于C语言中继承和多态的实现
- 关于C语言中继承和多态的实现
- C语言也可以“面向对象”—— C语言实现封装、继承和多态
- C语言实现继承和多态
- C语言实现继承和多态
- C语言实现继承和多态
- C语言实现继承和多态
- C语言实现继承和多态
- C语言实现继承和多态
- C语言实现继承和多态
- C语言实现继承和多态
- C 语言实现多态和继承
- c语言实现继承和多态
- 中文docbook转换成PDF
- XCode4中的文本查找和文本替换功能
- Kindle 3---原系统下的字典的使用
- Outlook 2010开机自启动
- 抢占式内核和非抢占式内核的区别
- BREW中接口——C语言实现继承和多态
- Silverlight 调用WebService 服务查询数据库
- 不开辟用于交换数据的临时空间,如何完成字符串的逆序
- 游戏中的爆炸实现
- 浅谈大脑思维和对未来计算机的设想(2)
- SQl 语句(常见) 新建,删除,修改表结构
- C# 强制退出程序
- MongoDB 入门详解
- ubuntu 下设置双显示器