C语言下的封装 继承 与多态.docx
《C语言下的封装 继承 与多态.docx》由会员分享,可在线阅读,更多相关《C语言下的封装 继承 与多态.docx(10页珍藏版)》请在三一办公上搜索。
1、C语言下的封装 继承 与多态C语言下的封装、继承与多态 上次课,钱SIR提到,Liux下面也有很多用C实现的面向对象的结构。比较感觉兴趣,就在网上查了一些资料,原来C语言模拟实现面向对象语言所具有的特性:多态,继承,封装,也是一件很简单的事儿。并且现在很多开源软件都了用C语言实现了这几个特性,包括大型开源数据库系统postgreSQL,可移植的C语言面向对象框架GObject。 在自己机器上实践了下,感叹C语言的灵活与强大!总结一下,以便交流: 一、基础知识 结构体 结构体可以嵌套,因而可以把一个结构体当成另一个结构体的成员,如: cppview plaincopyprint? 1. stru
2、ct Point 2. int x; 3. int y; 4. ; struct Point int x; int y;cppview plaincopyprint? 1. struct Circle 2. struct Point point_; 3. int radius; 4. ; struct Circle struct Point point_; int radius; ; 该结构体与以下定义完全一样void * 指针是整个 C 语言的精髓所在。而你也一直敬畏着指针,又爱又恨地使用着它。许多教材都告诉你,int *叫做指向整型的指针,而 char *是指向字符型的指针,等等等等不一而
3、足。然而这里有一个另类的指针家族成员void *。不要按照通常的命名方式叫它做指向void 类型的指针,它的正式的名字叫做:可以指向任意类型的指针。 C中的参数个数可变函数 可变参数函数的原型声明: cppview plaincopyprint? 1. type VAFunction(type arg1, type arg2, ); type VAFunction(type arg1, type参数可以分为两部分:个数确定的固定参数和个数可变的可选参数。函数至少需要一个固定参数,固定参数的声明和普通函数一样;可选参数由于个数不确定,声明时用.表示。固定参数和可选参数公同构成一个函数的参数列表。
4、 标准C/C+包含头文件stdarg.h,该头文件中定义了操作不定变量的相关宏: cppview plaincopyprint? 1. void va_start ( va_list arg_ptr, prev_param ); /* ANSI version */ 2. type va_arg ( va_list arg_ptr, type ); 3. void va_end ( va_list arg_ptr ); void va_start ( va_list arg_ptrtype va_arg ( va_list arg_ptr, void va_end ( va_list arg_
5、ptr )在这些宏中,va就是variable argument(可变参数)的意思; arg_ptr 是指向可变参数表的指针; prev_param 指可变参数表的前一个固定参数; type 为可变参数的类型。 va_list 也是一个宏,其定义为typedef char * va_list,实质上是一char型指针。 具体用法可以参考: 二、封装 封装的主要含义是隐藏内部的行为和信息,使用者只用看到对外提供的接口和公开的信息。 在C语言中的实现方法:把私有数据信息放在一个不透明的priv变量或者结构体中,只有类的实现代码才知道priv或者结构体的真正定义。 例如: 头文件: cppview
6、plaincopyprint? 1. /=头文件:Point.h文件= 2. #ifndef POINT_H 3. #define POINT_H 4. typedef struct Point point; 5. typedef struct pointPrivate pointPrivate; 6. struct Point 7. 8. 9. struct pointPrivate *pp; 10. int get_x(point *point_); 11. int get_y(point *point_); 12. point * new_point(int x,int y); 13.
7、14. #endif /=头文件:Point.h文件=#ifndef POINT_H#define POINT_Htypedef struct Point point;typedef struct pointPrivate poist源文件 cppview plaincopyprint? 1. /=C文件:Point.c文件= 2. #include Point.h 3. #include 4. struct pointPrivate; 5. int x; 6. int y; 7. ; 8. 9. int get_x(point *point_) 10. return point_-pp-x;
8、 11. 12. 13. int get_y(point *point_) 14. return point_-pp-y; 15. 16. 17. point* new_point(int x,int y) 18. point* p=(point*)malloc(sizeof(point); 19. p-pp=(pointPrivate*)malloc(sizeof(pointPrivate); 20. p-pp-x=x; 21. p-pp-y=y; 22. return p; 23. /=C文件:Point.c文件=#include Point.h#includestruct pointPr
9、ivate; int x; int y;测试文件: cppview plaincopyprint? 1. int main 2. 3. point* p = new_point(1,2); 4. /printf(x:%d,y:%dn,p-pp-x,p-pp-y); 5. printf(x:%d,y:%dn,get_x(p),get_y(p); 6. int mainpoint* p = new_point(1,/printf(x:%d,y:%dn,printf(x:%d,y:%dn,ge在测试代码中,注释掉的一部分是编译不过的,因为我们已经把pointPrivate结构体的定义隐藏了。而且必须
10、使用new_point来创建point结构对象,否则无法初始化point结构体中的pp成员变量。 有意思的是:这段代码生成的exe文件可能会被360误认为病毒。 三、继承 在C语言中,可以利用“结构在内存中的布局与结构的声明具有一致的顺序”这一事实实现继承。比如我们要设计一个作图工具,其中可能涉及到的对象有Point(点),Circle(圆),由于圆是由点组成的,所有可以看成Circle继承自Point。另外,Point和Circle都需要空间申请,空间释放等操作,所有他们有共同的基类Base。 cppview plaincopyprint? 1. /基类Base的内部头文件Base.r,对外
11、隐藏 2. #ifndef BASE_R 3. #define BASE_R 4. #include 5. struct Base 6. size_t size; 7. void * (* ctor) (void * self, va_list * app);/构造函数 8. void * (* dtor) (void * self); /析构函数 9. void (* draw) (const void * self);/作图函数 10. ; 11. #endif 12. 13. /Point的内部头文件Point.r,对外隐藏 14. #ifndef POINT_R 15. #define
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言下的封装 继承 与多态 语言 封装
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-3155220.html