首页 / C语言 / 如何使用C语言的面向对象
如何使用C语言的面向对象
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何使用C语言的面向对象,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2543字,纯文字阅读大概需要4分钟。
内容图文
我们都知道,C++才是面向对象的语言,但是C语言是否能使用面向对象的功能?
(1)继承性
1 typedef struct _parent 2{ 3int data_parent; 4}Parent; 5 typedef struct _Child 6{ 7struct _parent parent; 8int data_child; 9 }Child;
在设计C语言继承性的时候,我们需要做的就是把基础数据放在继承的结构的首位置即可。这样,不管是数据的访问、数据的强转、数据的访问都不会有什么问题。
(2)封装性
class的类成员默认情况下都是private,而struct的成员都是public(不能改变),所以如何让C语言实现封装的功能呢?答案就是函数指针;这在内核中得到了广泛的应用;
1 struct _Data; 2 typedef void (*process)(struct _Data* pData); 3 typedef struct _Data 4{ 5int value; 6 process pProcess; 7 }Data;
封装性的意义在于,函数和数据是绑在一起的,数据和数据是绑在一起的。这样,我们就可以通过简单的一个结构指针访问到所有的数据,遍历所有的函数。封装性,这是类拥有的属性,当然也是数据结构体拥有的属性。
(3)多态性
在C++中,多态通常都是使用虚函数来实现的,但是C语言中并没有虚函数,如何实现重载呢?
答案也显而易见,也是函数指针的扩展,以下面例子为例:
1 #include <stdio.h> 2 #include <stdlib.h> 3 4//虚函数表结构 5struct base_vtbl 6{ 7void(*dance)(void *); 8void(*jump)(void *); 9}; 10 11//基类 12structbase 13{ 14/*virtual table*/ 15struct base_vtbl *vptr; 16}; 17 18void base_dance(void *this) 19{ 20 printf("base dance\n"); 21} 22 23void base_jump(void *this) 24{ 25 printf("base jump\n"); 26} 27 28/* global vtable for base */ 29struct base_vtbl base_table = 30{ 31 base_dance, 32 base_jump 33}; 34 35//基类的构造函数 36structbase * new_base() 37{ 38structbase *temp = (structbase *)malloc(sizeof(structbase)); 39 temp->vptr = &base_table; 40return temp; 41} 42 43 44//派生类 45struct derived1 46{ 47structbase super; 48/*derived members */ 49int high; 50}; 51 52void derived1_dance(void * this) 53{ 54/*implementation of derived1‘s dance function */ 55 printf("derived1 dance\n"); 56} 57 58void derived1_jump(void * this) 59{ 60/*implementation of derived1‘s jump function */ 61struct derived1* temp = (struct derived1 *)this; 62 printf("derived1 jump:%d\n", temp->high); 63} 64 65/*global vtable for derived1 */ 66struct base_vtbl derived1_table = 67{ 68 (void(*)(void *))&derived1_dance, 69 (void(*)(void *))&derived1_jump 70}; 71 72//派生类的构造函数 73struct derived1 * new_derived1(int h) 74{ 75struct derived1 * temp= (struct derived1 *)malloc(sizeof(struct derived1)); 76 temp->super.vptr = &derived1_table; 77 temp->high = h; 78return temp; 79} 80 81 82 83int main(void) 84{ 85 86structbase * bas = new_base(); 87//这里调用的是基类的成员函数 88 bas->vptr->dance((void *)bas); 89 bas->vptr->jump((void *)bas); 90 91 92struct derived1 * child = new_derived1(100); 93//基类指针指向派生类 94 bas = (structbase *)child; 95 96//这里调用的其实是派生类的成员函数 97 bas->vptr->dance((void *)bas); 98 bas->vptr->jump((void *)bas); 99return0; 100 }
综上所述,可以实现C语言的面向对象功能;
原文:https://www.cnblogs.com/linhaostudy/p/8448088.html
内容总结
以上是互联网集市为您收集整理的如何使用C语言的面向对象全部内容,希望文章能够帮你解决如何使用C语言的面向对象所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。