c语言中如何使用面向对象编程,如何使用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语言的面向对象功能;
c语言中如何使用面向对象编程,如何使用C语言的面向对象相关推荐
- 【编程实践】第二章 C++面向对象编程《C++程序设计语言》 / By 禅与计算机程序设计艺术ChatGPT
[编程实践]第二章 C++面向对象编程<C++程序设计语言> / By 禅与计算机程序设计艺术&ChatGPT 第二章 C++面向对象编程 在C++中,面向对象编程主要通过类和对象 ...
- c语言中函数名可不可以由用户命名,C语言中变量名及函数名的命名规则与驼峰命名法...
在程序设计中,变量名.函数名.数组名等统称为标识 符.简单地说,标识符就是一个名字.除库函数的函数名由系统定义外,其余都由用户自定义.C语言规定,标识符只能由字母(a-z,A-Z).数字 (0-9). ...
- c语言中不能编译,为什么`int;`可以在C语言中很好地编译,而在C ++中却不能?
考虑以下程序(请参见此处的现场演示). #include int main(void) { int ; // Missing variable name puts("Surprise&qu ...
- python面向对象编程的优点-Python语言有哪些优点?
2018年主流的十大编程语言中,Python排名第一,被广大使用者誉为"更美好"编程语言.Python语言自身的语言特点,使得他深受开发者的喜爱,那么Python语言到底有哪些优点 ...
- 指针在c语言中起什么作用,编程中指针的作用是什么?
原标题:编程中指针的作用是什么? 编程语言中,何为指针?它们都有什么用呢?其实通俗点讲,将一个椅子放进一个小房间锁上门,你若想拿出凳子,就必须有锁门的钥匙,而这钥匙就是指针. 举一个简单的例子: in ...
- c语言中鱼贯指针的编程题,泡面吧 IT宅男如何打造编程教学网站
导语:目前泡面吧开放的课程包括编程初学入门常识.C语言入门.C语言进阶.C++入门等7门.在美国,趣味编程网站Codecademy如今异常火爆 互联网这块神奇的热土从来不缺少励志故事. 2014年4月 ...
- SCL语言中如何进行GUI编程?
SCL语言(Step 7 Control Language)是西门子PLC编程语言之一,用于程序控制和自动化任务.在SCL语言中,可以使用STEP 7软件提供的工具和库来进行GUI编程. 下面是一些基 ...
- 【转载】c语言中的可变参数编程
在c语言中使用变长参数最常见的就是下面两个函数了: int printf(const char *format, ...);int scanf(const char *format, ...); 那他 ...
- C语言中前面有四个空格,在C语言编程中什么叫前导空格,什么叫尾随空 – 手机爱问...
在c语言中,何为条件运算符!具体 计算机具有逻辑判断能力,其判断的依据是计算机内部进行逻辑运算的结果.C语言提供了关系运算和逻辑运算,用来构造C程序控制中的条件,实现程序的选择结构和循环结构控制. 关 ...
最新文章
- englis translate,word
- uboot启动流程概述_Alibaba Cloud Linux 2 LTS OS 启动优化实践
- localStorage.getItem 往浏览器里面储存数据到本地localStorage
- 迭代开发个人总结20160627
- 我的世界java内存不足_[菜鸟级]简单解决内存溢出内存不足、卡机问题(可当启动器使用)...
- 浅谈商品推荐:如何猜中用户的心思?
- 微信接入之获取用户头像
- vue移动端日历显示查看每日详情列表
- 将两块球形橡皮泥揉在一起,捏成一个正方体。请编程,完成下述功能:从键盘读入2个球形橡皮泥的直径,直径为浮点数;求正方体的边长,并保留两位小数输出;
- 【数据挖掘】K-Means 一维数据聚类分析示例
- 怎么去除视频字幕清理视频字幕或水印的几种方法
- 我为什么选择使用Go语言?
- python中摄氏度的符号咋打_linux下怎么方便的输入度数符号 °
- 互联网发展史【计网】
- 两国的“微”与“博”——Twitter与新浪微博的功能差异化探究
- 分享一款屏幕录制软件,无需安装,可直接将操作屏幕录制起来--
- PyTorch:生态简介
- 苹果手机一卡通找不到了的解决方案 换手机 重下APP 找不到一卡通解决方案
- 为什么计算机专业毕业生还要参加IT培训?
- 密码学第三讲——对称密码(XOR与一次性密码本)
热门文章
- LeetCode之Rotate Array
- Android之倍数提高工作效率的 Android Studio 奇技
- 看聊天记录都学不会C语言?太菜了吧》(16)我一直以为校花很漂亮,直到我叫了她一声...
- npm 安装less插件_node+npm+webpack+less安装
- 一个富二代仅凭“1+1”就压制了全世界的数学家两个世纪......
- 让TA们告诉你,疫情当下如何更彪悍的成长
- 新一代来袭︱不只是舒适,简直是享受,Google公司用的腰靠,到底有什么秘密?...
- 催人泪下!一个程序员的悲惨故事
- java判断时间区间 隔天_Java初中级程序员面试题宝典
- php+转义实体字符,PHP针对HTML实体字符的转义函数