news 2026/4/24 3:58:18

C语言也能实现面向对象?封装和继承这样写

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言也能实现面向对象?封装和继承这样写

当前正运用C开展项目,先前习惯使用C++,再回过头使用C着实有些不太适应。C++语言里自带面向对象支持,像封装、继承、多态等这类面向对象的基本特征。C原本是面向过程的语言,自身不存在内建这些特性,不过我们依旧能够借助C语言本身已有的特性来达成面向对象的一些基本特征。接下来我们会逐一详细讲述封装、继承、多态、纯虚类等面向对象特性在C语言里怎样实现,并且给出实例。

这篇文章中我们先说封装和继承。

先来看封装。

所谓封装,通俗来讲,是指一个姑娘化了妆,仅让你瞧见她愿让你看的那一面,至于内里是否刮了骨、垫了别的,并不给你看。提及封装便要说隐藏,这是与兄弟相关的概念;实际上我觉得隐藏是更深层次的封装,全然不让你看到,而封装或许犹如犹抱琵琶半遮面。封装在C++语言里有protected、private关键字在语言层面予以支持,而C语言中不存在这些。C有结构体(struct),实际上能够达成封装与隐藏。

在QT当中,为了能够将一个类的具体实现更好地进行隐藏,通常情况是,存在一个公开头文件,还存在一个私有头文件,在私有头文件里对实现的内部细节予以定义,在公开头文件里对开放给客户程序员的接口以及公共数据进行定义。去瞧瞧QObject(qobject.h),与之对应的有一个QObjectPrivate(qobject_p.h),其他的状况也是相似的。并且代码框架如下:

QObject{ public: xxx xxx private: QObjectPrivate * priv; };

完全能够在C语言里,运用同样的方式去达成封装以及隐藏,仅仅是放置于结构体当中罢了。代码框架如下:

struct st_abc_private; struct st_abc { int a; xxx; void (*xyz_func)(struct st_abc*); struct st_abc_private * priv; };

前面的代码之中,我们仅仅是进行了结构体 struct st_abc_private 的前向声明,并没有人清楚明确晓得它内部确切究竟是什么样子的事物。假设,struct st_abc所对应的头文件为abc.h,那么,将st_abc_private的声明放置于abc_p.h里,abc.c文件包含abc_p.h,那么,在实现struct st_abc的函数指针xyz_func时,怎样去使用struct st_abc_private,客户程序员根本不需要知道。

这般去做所具备的好处是明显能够看见的,除开预先定义好的接口之外,客户程序员根本完全不需要晓得涉及的实现细节,就算实现经历了重构且完全重新再来一遍,客户程序员也无需去予以关注,甚至与之相应的模块连贯重新编译都不需要,因为abc.h从开始到结束都未曾有过改变。

上面写的代码存在着一个方面的问题,客户程序员要怎样才能够获取到struct st_abc的一个实例呢,他并不清楚struct st_abc_private是怎样去进行实现的呀。C这个编程语言里面是没有构造函数那种东西存在的,所以只能是我们自己来提供了:我们能够在abc.h这个文件里面去声明一个跟构造函数较为相似的函数从而生成struct st_abc的实例,它的名字就被称作新的abc(new_abc),函数的原型情况如下:

struct st_abc * new_abc();

提及实现,我们将其放置于abc.c里,客户程序员不存在知晓的必要。与之相对的,存在一个好似析构函数这般的函数,其原型如下:

void delete_abc(struct st_abc *);

到现在为止,封装和隐藏就实现了,而且很彻底。接下来看继承。

何为继承呢?于面向对象层面不再阐述,仅讲语法层面。在语法层面谈起,继承乃是派生类具备父类的数据、方法,还增添了些许自身的内容,即所谓子承父业并予以发扬光大。于C语言里能够借助结构体的包含去达成继承关系。代码框架为如下这般:

struct st_base{ xxx; }; struct st_derived{ struct sb_base base; yyy; };

代码方面呈现出的就是这般简易,然而存在一点需要予以留意,其一便是在派生类(结构体)当中务必将父类类型的成员放置于首位。

承接从语法层面去考究,存在数据成员、函数,数据成员借助上面的方式会自行“承继”,至于函数,于结构体里体现为函数指针,实际上同样是一个数据成员,仅是个指针罢了,也会自动“承继”。之所以仍要在此处罗列予以说明,是由于C++之中存有一个相当关键的概念:重载。要在C里完整达成会有些繁杂。

重载,我们常说的重载大概有三种含义:

平常我们在进行交流的时候,通常不会去明确地区分上面那三种类型的重载,在这里呢,出于习惯,同样也不会作区分。

好了,第一篇就到这里,有时间会往下续。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/24 3:57:24

AI技术在日常与工业场景中的隐形应用与实战解析

1. 人工智能的"隐形"革命2007年第一代iPhone发布时,没人想到这个小设备会彻底改变人类交互方式。如今AI技术正经历类似的渗透过程——它早已不是科幻电影里的遥远概念,而是像电力一样融入我们生活的每个缝隙。上周我在超市自助结账时&#xff…

作者头像 李华
网站建设 2026/4/24 3:56:50

程序员必学的AIChatGPT实战训练营

2026就业新趋势:ChatGPT实战能力成人才核心标配站在2026年的职场节点回望,关于“AI是否会取代人类”的争论早已尘埃落定。答案清晰而残酷:AI不会取代你,但“最先掌握AI的人”将会取代“较晚掌握AI的人”。在经历了2023年的概念爆发…

作者头像 李华
网站建设 2026/4/24 3:53:16

从混乱到有序:GitHub Docs RBAC权限管理终极指南

从混乱到有序:GitHub Docs RBAC权限管理终极指南 【免费下载链接】docs The open-source repo for docs.github.com 项目地址: https://gitcode.com/GitHub_Trending/do/docs GitHub Docs作为开源项目的核心文档仓库,有效的权限管理是保障项目安全…

作者头像 李华
网站建设 2026/4/24 3:52:35

终极指南:如何为不支持连字的IDE安装FiraCode编程字体插件

终极指南:如何为不支持连字的IDE安装FiraCode编程字体插件 【免费下载链接】FiraCode Free monospaced font with programming ligatures 项目地址: https://gitcode.com/GitHub_Trending/fi/FiraCode FiraCode是一款免费的等宽编程字体,以其丰富…

作者头像 李华
网站建设 2026/4/24 3:52:12

InDesign自动化排版:基于JS脚本的智能参考线批量生成插件开发

1. InDesign自动化排版与智能参考线的价值 每次处理多页杂志排版时,最让我头疼的就是手动拖拽参考线对齐几十个图文框。有次赶稿到凌晨三点,发现整本画册的参考线偏移了2像素,不得不全选重调。这种重复劳动促使我研究用JS脚本批量生成参考线的…

作者头像 李华