我们都知道,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语言的面向对象功能;

c语言中如何使用面向对象编程,如何使用C语言的面向对象相关推荐

  1. 【编程实践】第二章 C++面向对象编程《C++程序设计语言》 / By 禅与计算机程序设计艺术ChatGPT

    [编程实践]第二章 C++面向对象编程<C++程序设计语言> / By 禅与计算机程序设计艺术&ChatGPT 第二章 C++面向对象编程 在C++中,面向对象编程主要通过类和对象 ...

  2. c语言中函数名可不可以由用户命名,C语言中变量名及函数名的命名规则与驼峰命名法...

    在程序设计中,变量名.函数名.数组名等统称为标识 符.简单地说,标识符就是一个名字.除库函数的函数名由系统定义外,其余都由用户自定义.C语言规定,标识符只能由字母(a-z,A-Z).数字 (0-9). ...

  3. c语言中不能编译,为什么`int;`可以在C语言中很好地编译,而在C ++中却不能?

    考虑以下程序(请参见此处的现场演示). #include int main(void) { int ;  // Missing variable name puts("Surprise&qu ...

  4. python面向对象编程的优点-Python语言有哪些优点?

    2018年主流的十大编程语言中,Python排名第一,被广大使用者誉为"更美好"编程语言.Python语言自身的语言特点,使得他深受开发者的喜爱,那么Python语言到底有哪些优点 ...

  5. 指针在c语言中起什么作用,编程中指针的作用是什么?

    原标题:编程中指针的作用是什么? 编程语言中,何为指针?它们都有什么用呢?其实通俗点讲,将一个椅子放进一个小房间锁上门,你若想拿出凳子,就必须有锁门的钥匙,而这钥匙就是指针. 举一个简单的例子: in ...

  6. c语言中鱼贯指针的编程题,泡面吧 IT宅男如何打造编程教学网站

    导语:目前泡面吧开放的课程包括编程初学入门常识.C语言入门.C语言进阶.C++入门等7门.在美国,趣味编程网站Codecademy如今异常火爆 互联网这块神奇的热土从来不缺少励志故事. 2014年4月 ...

  7. SCL语言中如何进行GUI编程?

    SCL语言(Step 7 Control Language)是西门子PLC编程语言之一,用于程序控制和自动化任务.在SCL语言中,可以使用STEP 7软件提供的工具和库来进行GUI编程. 下面是一些基 ...

  8. 【转载】c语言中的可变参数编程

    在c语言中使用变长参数最常见的就是下面两个函数了: int printf(const char *format, ...);int scanf(const char *format, ...); 那他 ...

  9. C语言中前面有四个空格,在C语言编程中什么叫前导空格,什么叫尾随空 – 手机爱问...

    在c语言中,何为条件运算符!具体 计算机具有逻辑判断能力,其判断的依据是计算机内部进行逻辑运算的结果.C语言提供了关系运算和逻辑运算,用来构造C程序控制中的条件,实现程序的选择结构和循环结构控制. 关 ...

最新文章

  1. englis translate,word
  2. uboot启动流程概述_Alibaba Cloud Linux 2 LTS OS 启动优化实践
  3. localStorage.getItem 往浏览器里面储存数据到本地localStorage
  4. 迭代开发个人总结20160627
  5. 我的世界java内存不足_[菜鸟级]简单解决内存溢出内存不足、卡机问题(可当启动器使用)...
  6. 浅谈商品推荐:如何猜中用户的心思?
  7. 微信接入之获取用户头像
  8. vue移动端日历显示查看每日详情列表
  9. 将两块球形橡皮泥揉在一起,捏成一个正方体。请编程,完成下述功能:从键盘读入2个球形橡皮泥的直径,直径为浮点数;求正方体的边长,并保留两位小数输出;
  10. 【数据挖掘】K-Means 一维数据聚类分析示例
  11. 怎么去除视频字幕清理视频字幕或水印的几种方法
  12. 我为什么选择使用Go语言?
  13. python中摄氏度的符号咋打_linux下怎么方便的输入度数符号 °
  14. 互联网发展史【计网】
  15. 两国的“微”与“博”——Twitter与新浪微博的功能差异化探究
  16. 分享一款屏幕录制软件,无需安装,可直接将操作屏幕录制起来--
  17. PyTorch:生态简介
  18. 苹果手机一卡通找不到了的解决方案 换手机 重下APP 找不到一卡通解决方案
  19. 为什么计算机专业毕业生还要参加IT培训?
  20. 密码学第三讲——对称密码(XOR与一次性密码本)

热门文章

  1. LeetCode之Rotate Array
  2. Android之倍数提高工作效率的 Android Studio 奇技
  3. 看聊天记录都学不会C语言?太菜了吧》(16)我一直以为校花很漂亮,直到我叫了她一声...
  4. npm 安装less插件_node+npm+webpack+less安装
  5. 一个富二代仅凭“1+1”就压制了全世界的数学家两个世纪......
  6. 让TA们告诉你,疫情当下如何更彪悍的成长
  7. 新一代来袭︱不只是舒适,简直是享受,Google公司用的腰靠,到底有什么秘密?...
  8. 催人泪下!一个程序员的悲惨故事
  9. java判断时间区间 隔天_Java初中级程序员面试题宝典
  10. php+转义实体字符,PHP针对HTML实体字符的转义函数