我们都知道,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语言的面向对象?相关推荐

  1. C语言实现面向对象示例

    用C语言实现面向对象的方法,面向对象的三个基本特征,对象唯一性,继承性,抽象性. 使用C语言中的结构体和函数指针将数据与操作放在一起,使得一个问题的解决方法封装在结构体中. 其中结构体的嵌套使用实现了 ...

  2. C语言实现面向对象的思想

    用C语言实现面向对象的方法,面向对象的三个基本特征,对象唯一性,继承性,抽象性. 使用C语言中的结构体和函数指针将数据与操作放在一起,使得一个问题的解决方法封装在结构体中. 其中结构体的嵌套使用实现了 ...

  3. C++学习笔记:(七)C语言实现面向对象编程

    面试官:C和C++有什么不同? 应聘者:一个是面向过程,一个是面向对象. 这样的答案在我看是不完全正确,因为面向过程编程和面向对象编程是编程思想,C++可以用面向过程的思想编程,同样,C语言也可以用面 ...

  4. c语言中如何使用面向对象编程,如何使用C语言的面向对象

    我们都知道,C++才是面向对象的语言,但是C语言是否能使用面向对象的功能? (1)继承性 typedef struct _parent { int data_parent; }Parent; type ...

  5. 数据结构与算法(C#版)第二章 C#语言与面向对象技术(下)V1.0

    由于本学期我给本科生上<数据结构与算法>这门课程,边上边把自己的教案进行总结,发到CSDN上面,希望大家多多指正. 第二章 C#语言与面向对象技术(下) 二.面向对象技术 5.属性 6.索 ...

  6. 数据结构与算法(C#版)第二章 C#语言与面向对象技术(中)V1.0

    由于本学期我给本科生上<数据结构与算法>这门课程,边上边把自己的教案进行总结,发到CSDN上面,希望大家多多指正. 第二章 C#语言与面向对象技术(中) 二.面向对象技术 1.类与对象 2 ...

  7. 数据结构与算法(C#版)第二章 C#语言与面向对象技术(上)V1.0

    由于本学期我给本科生上<数据结构与算法>这门课程,边上边把自己的教案进行总结,发到CSDN上面,希望大家多多指正. 第二章 C#语言与面向对象技术(上) 一.C#语言 1.数据类型 2.常 ...

  8. c语言uint32_使C语言实现面向对象的三个要素,你掌握了吗?

    编排 | strongerHuang 微信公众号 | strongerHuang 不知道有多少人去了解过语言的发展史,早期C语言的语法功能其实比较简单.随着应用需求和场景的变化,C语言的语法功能在不断 ...

  9. 飞鸽传书2007程序语言的面向对象最后会成自然语言吗?

    飞鸽传书2007程序语言的面向对象最后会成自然语言吗?程序语言的向自然语言靠拢,自底向上还是自顶向下? 飞鸽传书2007绿色版: http://www.freeeim.com/ipmsg/ipmsg_ ...

最新文章

  1. strtok()思考
  2. adc量化单位_单片机外围模块漫谈之二,如何提高ADC转换精度
  3. Oracle OEM 配置报错: No value was set for the parameter DBCONTROL_HTTP_PORT 解决方法
  4. 将ejs转为html,Node.js Express Web应用框架ejs修改为html
  5. eclipse导入Java文件后出现中文乱码
  6. NOIP竞赛学习整理--动态规划算法举例P1264
  7. datax调研及增量更新的思路
  8. 阿里高级技术专家:整洁的应用架构“长”什么样?
  9. Android-NDK-hello-jniCallback
  10. Linux 下用来查询安装包信息的RPM选项
  11. 一步一步学Vue(四)
  12. 2.6 利用FTP上传所有文件
  13. coreldraw是什么软件好学吗?cdr矢量图形制作工具
  14. VS2017使用C#编写COM组件
  15. centos下安装transmission下载工具
  16. ubuntu16.04,exFAT格式U盘无法打开解决方式
  17. 《钻哥带您了解产品原型》(Yanlz+Unity+XR+需求分析+核心思路+产品核心+生产流程+制作核心+销售核心+立钻哥哥+==)
  18. 【工具】Alfred2.5.1使用全攻略!神一样的Mac app!(神一样的搜索)(推荐)
  19. 孟岩:我反对将Token翻译成“代币”
  20. CSS弹性盒子布局flex

热门文章

  1. orm java_Java 8 Friday:不再需要ORM
  2. 远程桌面服务怎么测试_快速的远程服务测试
  3. java 使用本机代理_Java与本机代理–他们所做的强大功能
  4. 堆栈溢出回答了我们不知道的Java首要问题
  5. Java Bean验证基础
  6. Java命令行界面(第13部分):JArgs
  7. idea使用junit测试_在JUnit测试中使用Builder模式
  8. 依赖注入通俗解释_我如何向团队解释依赖注入
  9. 策略模式应用场景和uml_策略模式
  10. Eclipse扩展的轻量级集成测试