如何使用C语言的面向对象?
我们都知道,C 才是面向对象的语言,但是C语言是否能使用面向对象的功能?
(1)继承性
typedef struct _parent
{
int data_parent;
}Parent;
typedef struct _Child
{
struct _parent parent;
int data_child;
}Child;
在设计C语言继承性的时候,我们需要做的就是把基础数据放在继承的结构的首位置即可。这样,不管是数据的访问、数据的强转、数据的访问都不会有什么问题。
(2)封装性
class的类成员默认情况下都是private,而struct的成员都是public(不能改变),所以如何让C语言实现封装的功能呢?答案就是函数指针;这在内核中得到了广泛的应用;
struct _Data;
typedef void (*process)(struct _Data* pData);
typedef struct _Data
{
int value;
process pProcess;
}Data;
封装性的意义在于,函数和数据是绑在一起的,数据和数据是绑在一起的。这样,我们就可以通过简单的一个结构指针访问到所有的数据,遍历所有的函数。封装性,这是类拥有的属性,当然也是数据结构体拥有的属性。
(3)多态性
在C 中,多态通常都是使用虚函数来实现的,但是C语言中并没有虚函数,如何实现重载呢?
答案也显而易见,也是函数指针的扩展,以下面例子为例:
#include
#include
//虚函数表结构
struct base_vtbl
{
void(*dance)(void *);
void(*jump)(void *);
};
//基类
struct base
{
/*virtual table*/
struct base_vtbl *vptr;
};
void base_dance(void *this)
{
printf("base dance\n");
}
void base_jump(void *this)
{
printf("base jump\n");
}
/* global vtable for base */
struct base_vtbl base_table =
{
base_dance,
base_jump
};
//基类的构造函数
struct base * new_base()
{
struct base *temp = (struct base *)malloc(sizeof(struct base));
temp->vptr = &base_table;
return temp;
}
//派生类
struct derived1
{
struct base super;
/*derived members */
int high;
};
void derived1_dance(void * this)
{
/*implementation of derived1's dance function */
printf("derived1 dance\n");
}
void derived1_jump(void * this)
{
/*implementation of derived1's jump function */
struct derived1* temp = (struct derived1 *)this;
printf("derived1 jump:%d\n", temp->high);
}
/*global vtable for derived1 */
struct base_vtbl derived1_table =
{
(void(*)(void *))&derived1_dance,
(void(*)(void *))&derived1_jump
};
//派生类的构造函数
struct derived1 * new_derived1(int h)
{
struct derived1 * temp= (struct derived1 *)malloc(sizeof(struct derived1));
temp->super.vptr = &derived1_table;
temp->high = h;
return temp;
}
int main(void)
{
struct base * bas = new_base();
//这里调用的是基类的成员函数
bas->vptr->dance((void *)bas);
bas->vptr->jump((void *)bas);
struct derived1 * child = new_derived1(100);
//基类指针指向派生类
bas = (struct base *)child;
//这里调用的其实是派生类的成员函数
bas->vptr->dance((void *)bas);
bas->vptr->jump((void *)bas);
return 0;
}
综上所述,可以实现C语言的面向对象功能;
来源:
https://www.cnblogs.com/linhaostudy/p/8448088.html
如何使用C语言的面向对象?相关推荐
- C语言实现面向对象示例
用C语言实现面向对象的方法,面向对象的三个基本特征,对象唯一性,继承性,抽象性. 使用C语言中的结构体和函数指针将数据与操作放在一起,使得一个问题的解决方法封装在结构体中. 其中结构体的嵌套使用实现了 ...
- C语言实现面向对象的思想
用C语言实现面向对象的方法,面向对象的三个基本特征,对象唯一性,继承性,抽象性. 使用C语言中的结构体和函数指针将数据与操作放在一起,使得一个问题的解决方法封装在结构体中. 其中结构体的嵌套使用实现了 ...
- C++学习笔记:(七)C语言实现面向对象编程
面试官:C和C++有什么不同? 应聘者:一个是面向过程,一个是面向对象. 这样的答案在我看是不完全正确,因为面向过程编程和面向对象编程是编程思想,C++可以用面向过程的思想编程,同样,C语言也可以用面 ...
- c语言中如何使用面向对象编程,如何使用C语言的面向对象
我们都知道,C++才是面向对象的语言,但是C语言是否能使用面向对象的功能? (1)继承性 typedef struct _parent { int data_parent; }Parent; type ...
- 数据结构与算法(C#版)第二章 C#语言与面向对象技术(下)V1.0
由于本学期我给本科生上<数据结构与算法>这门课程,边上边把自己的教案进行总结,发到CSDN上面,希望大家多多指正. 第二章 C#语言与面向对象技术(下) 二.面向对象技术 5.属性 6.索 ...
- 数据结构与算法(C#版)第二章 C#语言与面向对象技术(中)V1.0
由于本学期我给本科生上<数据结构与算法>这门课程,边上边把自己的教案进行总结,发到CSDN上面,希望大家多多指正. 第二章 C#语言与面向对象技术(中) 二.面向对象技术 1.类与对象 2 ...
- 数据结构与算法(C#版)第二章 C#语言与面向对象技术(上)V1.0
由于本学期我给本科生上<数据结构与算法>这门课程,边上边把自己的教案进行总结,发到CSDN上面,希望大家多多指正. 第二章 C#语言与面向对象技术(上) 一.C#语言 1.数据类型 2.常 ...
- c语言uint32_使C语言实现面向对象的三个要素,你掌握了吗?
编排 | strongerHuang 微信公众号 | strongerHuang 不知道有多少人去了解过语言的发展史,早期C语言的语法功能其实比较简单.随着应用需求和场景的变化,C语言的语法功能在不断 ...
- 飞鸽传书2007程序语言的面向对象最后会成自然语言吗?
飞鸽传书2007程序语言的面向对象最后会成自然语言吗?程序语言的向自然语言靠拢,自底向上还是自顶向下? 飞鸽传书2007绿色版: http://www.freeeim.com/ipmsg/ipmsg_ ...
最新文章
- strtok()思考
- adc量化单位_单片机外围模块漫谈之二,如何提高ADC转换精度
- Oracle OEM 配置报错: No value was set for the parameter DBCONTROL_HTTP_PORT 解决方法
- 将ejs转为html,Node.js Express Web应用框架ejs修改为html
- eclipse导入Java文件后出现中文乱码
- NOIP竞赛学习整理--动态规划算法举例P1264
- datax调研及增量更新的思路
- 阿里高级技术专家:整洁的应用架构“长”什么样?
- Android-NDK-hello-jniCallback
- Linux 下用来查询安装包信息的RPM选项
- 一步一步学Vue(四)
- 2.6 利用FTP上传所有文件
- coreldraw是什么软件好学吗?cdr矢量图形制作工具
- VS2017使用C#编写COM组件
- centos下安装transmission下载工具
- ubuntu16.04,exFAT格式U盘无法打开解决方式
- 《钻哥带您了解产品原型》(Yanlz+Unity+XR+需求分析+核心思路+产品核心+生产流程+制作核心+销售核心+立钻哥哥+==)
- 【工具】Alfred2.5.1使用全攻略!神一样的Mac app!(神一样的搜索)(推荐)
- 孟岩:我反对将Token翻译成“代币”
- CSS弹性盒子布局flex