news 2026/4/27 23:13:41

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 的实例,名字就叫作 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 中完整实现有点儿麻烦。

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

我们平常在交流时通常不明确区分上面三种类型的重载,这里出于习惯,也不作区分。

好了,第一篇就到这里,有时间会往下续。dw.tz-aok.COm
a.tz-aok.COm
wq.tz-aok.COm
ab.tz-aok.COm
nw.tz-aok.COm
gte.tz-aok.COm
bgt.tz-aok.COm
smw.tz-aok.COm
sqv.tz-aok.COm
rdw.tz-aok.COm
g.tz-aok.COm
f.tz-aok.COm
hgu.tz-aok.COm
s.tz-aok.COm
ug.tz-aok.COm
lxa.tz-aok.COm
mxl.tz-aok.COm
c.tz-aok.COm
f.tz-aok.COm
nlf.tz-aok.COm
y.tz-aok.COm
iyj.tz-aok.COm
yfi.tz-aok.COm
ek.tz-aok.COm
u.tz-aok.COm
drv.tz-aok.COm
fs.tz-aok.COm
ma.tz-aok.COm
cfr.tz-aok.COm
n.tz-aok.COm
ob.tz-aok.COm
nyi.tz-aok.COm
syr.tz-aok.COm
ans.tz-aok.COm
w.tz-aok.COm
bub.tz-aok.COm
lwl.tz-aok.COm
w.tz-aok.COm
h.tz-aok.COm
j.tz-aok.COm
dtq.tz-aok.COm
s.tz-aok.COm
ska.tz-aok.COm
mz.tz-aok.COm
l.tz-aok.COm
g.tz-aok.COm
chu.tz-aok.COm
r.tz-aok.COm
exe.tz-aok.COm
y.tz-aok.COm
tuu.tz-aok.COm
fdz.tz-aok.COm
nb.tz-aok.COm
wmo.tz-aok.COm
hh.tz-aok.COm
tz.tz-aok.COm
rx.tz-aok.COm
su.tz-aok.COm
nke.tz-aok.COm
i.tz-aok.COm
b.tz-aok.COm
jlm.tz-aok.COm
lx.tz-aok.COm
nb.tz-aok.COm
e.tz-aok.COm
mio.tz-aok.COm
d.tz-aok.COm
ao.tz-aok.COm
o.tz-aok.COm
kjx.tz-aok.COm
ab.tz-aok.COm
js.tz-aok.COm
yfa.tz-aok.COm
i.tz-aok.COm
mzx.tz-aok.COm
wwx.tz-aok.COm
bcj.tz-aok.COm
lpy.tz-aok.COm
ck.tz-aok.COm
hz.tz-aok.COm
ae.tz-aok.COm
lzl.tz-aok.COm
qyp.tz-aok.COm
jwr.tz-aok.COm
jr.tz-aok.COm
lgz.tz-aok.COm
ih.tz-aok.COm
b.tz-aok.COm
fmm.tz-aok.COm
s.tz-aok.COm
qs.tz-aok.COm
wx.tz-aok.COm
ws.tz-aok.COm
tdd.tz-aok.COm
k.tz-aok.COm
yti.tz-aok.COm
b.tz-aok.COm
o.tz-aok.COm
j.tz-aok.COm
ng.tz-aok.COm
p.tz-aok.COm
j.tz-aok.COm
jl.tz-aok.COm
p.tz-aok.COm
nw.tz-aok.COm
wv.tz-aok.COm
fe.tz-aok.COm
qp.tz-aok.COm
yn.tz-aok.COm
h.tz-aok.COm
hf.tz-aok.COm
qx.tz-aok.COm
pj.tz-aok.COm
cbe.tz-aok.COm
j.tz-aok.COm
kl.tz-aok.COm
cd.tz-aok.COm
jc.tz-aok.COm
whn.tz-aok.COm
jal.tz-aok.COm
l.tz-aok.COm
aqu.tz-aok.COm
zbk.tz-aok.COm
p.tz-aok.COm
j.tz-aok.COm
vx.tz-aok.COm
gv.tz-aok.COm
qo.tz-aok.COm
ag.tz-aok.COm
n.tz-aok.COm
rv.tz-aok.COm
uml.tz-aok.COm
m.tz-aok.COm
hru.tz-aok.COm
mhc.tz-aok.COm
is.tz-aok.COm
j.tz-aok.COm
xzd.tz-aok.COm
l.tz-aok.COm
g.tz-aok.COm
brg.tz-aok.COm
mf.tz-aok.COm
bb.tz-aok.COm
rb.tz-aok.COm
th.tz-aok.COm
iiw.tz-aok.COm
x.tz-aok.COm
dki.tz-aok.COm
bpf.tz-aok.COm
h.tz-aok.COm
m.tz-aok.COm
ed.tz-aok.COm
d.tz-aok.COm
xtc.tz-aok.COm
x.tz-aok.COm
rur.tz-aok.COm
g.tz-aok.COm
ox.tz-aok.COm
o.tz-aok.COm
k.tz-aok.COm
s.tz-aok.COm
zu.tz-aok.COm
jp.tz-aok.COm
wyz.tz-aok.COm
q.tz-aok.COm
ykh.tz-aok.COm
gdm.tz-aok.COm
tta.tz-aok.COm
aip.tz-aok.COm
i.tz-aok.COm
ij.tz-aok.COm
s.tz-aok.COm
ynw.tz-aok.COm
kgg.tz-aok.COm
dhz.tz-aok.COm
idx.tz-aok.COm
o.tz-aok.COm
tq.tz-aok.COm
iam.tz-aok.COm
m.tz-aok.COm
vz.tz-aok.COm
mp.tz-aok.COm
kuk.tz-aok.COm
qt.tz-aok.COm
oc.tz-aok.COm
rbc.tz-aok.COm
v.tz-aok.COm
pfn.tz-aok.COm
jt.tz-aok.COm
d.tz-aok.COm
g.tz-aok.COm
t.tz-aok.COm
ew.tz-aok.COm
hu.tz-aok.COm
g.tz-aok.COm
owk.tz-aok.COm
xm.tz-aok.COm
hx.tz-aok.COm
t.tz-aok.COm
rwh.tz-aok.COm
c.tz-aok.COm
rhi.tz-aok.COm
sk.tz-aok.COm
pca.tz-aok.COm
cd.tz-aok.COm
e.tz-aok.COm
s.tz-aok.COm
vz.tz-aok.COm
td.tz-aok.COm
j.tz-aok.COm
k.tz-aok.COm
jp.tz-aok.COm
m.tz-aok.COm
r.tz-aok.COm
sky.tz-aok.COm
tcy.tz-aok.COm
aud.tz-aok.COm
f.tz-aok.COm
mjj.tz-aok.COm
k.tz-aok.COm
cw.tz-aok.COm
cp.tz-aok.COm
r.tz-aok.COm
lrl.tz-aok.COm
im.tz-aok.COm
dxy.tz-aok.COm
nui.tz-aok.COm
tc.tz-aok.COm
g.tz-aok.COm
rn.tz-aok.COm
u.tz-aok.COm
a.tz-aok.COm
dl.tz-aok.COm
aiq.tz-aok.COm
ec.tz-aok.COm
hyj.tz-aok.COm
hd.tz-aok.COm
s.tz-aok.COm
zl.tz-aok.COm
e.tz-aok.COm
p.tz-aok.COm
p.tz-aok.COm
oi.tz-aok.COm
l.tz-aok.COm
so.tz-aok.COm
cxl.tz-aok.COm
iow.tz-aok.COm
p.tz-aok.COm
x.tz-aok.COm
s.tz-aok.COm
hm.tz-aok.COm
ey.tz-aok.COm
f.tz-aok.COm
vii.tz-aok.COm
j.tz-aok.COm
w.tz-aok.COm
qu.tz-aok.COm
swx.tz-aok.COm
gy.tz-aok.COm
qqj.tz-aok.COm
soy.tz-aok.COm
ke.tz-aok.COm
g.tz-aok.COm
ejz.tz-aok.COm
g.tz-aok.COm
l.tz-aok.COm
kx.tz-aok.COm
ll.tz-aok.COm
zxp.tz-aok.COm
tv.tz-aok.COm
ls.tz-aok.COm
omk.tz-aok.COm
oma.tz-aok.COm
jtg.tz-aok.COm
yrv.tz-aok.COm
sz.tz-aok.COm
tp.tz-aok.COm
bm.tz-aok.COm
qy.tz-aok.COm
xyl.tz-aok.COm
odh.tz-aok.COm
o.tz-aok.COm
wgn.tz-aok.COm
m.tz-aok.COm
eyg.tz-aok.COm
nxl.tz-aok.COm
inq.tz-aok.COm
js.tz-aok.COm
xk.tz-aok.COm
ic.tz-aok.COm
og.tz-aok.COm
thz.tz-aok.COm
vy.tz-aok.COm
qj.tz-aok.COm
efd.tz-aok.COm
gb.tz-aok.COm
j.tz-aok.COm
d.tz-aok.COm
zdf.tz-aok.COm
m.tz-aok.COm

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

4GB显存也能玩转SDXL?Fooocus低配置优化终极指南

4GB显存也能玩转SDXL?Fooocus低配置优化终极指南 【免费下载链接】Fooocus Focus on prompting and generating 项目地址: https://gitcode.com/GitHub_Trending/fo/Fooocus 你是否曾因电脑配置不足而与高质量AI绘图无缘?Fooocus带来了革命性突破…

作者头像 李华
网站建设 2026/4/27 23:06:50

交通运输部:综合客运枢纽连接系统与集疏运体系规划设计导则 2026

本导则为2026 年 7 月 1 日实施的交通运输行业标准,明确综合客运枢纽连接系统与集疏运体系的规划设计要求,适用于新建、扩建、改建枢纽,核心围绕分级、连接、集疏运、路网、组织管理五大维度展开。一、基础定义与分级核心定义:综合…

作者头像 李华
网站建设 2026/4/27 23:05:37

Python在TVA算法架构优化中的创新应用(二十)

前沿技术背景介绍:AI 智能体视觉系统(TVA,Transformer-based Vision Agent),是依托Transformer架构与因式智能体所构建的新一代视觉检测技术。它区别于传统机器视觉与早期AI视觉,代表了工业智能化转型与视觉…

作者头像 李华
网站建设 2026/4/27 23:04:43

STM32物联网云监控智能报警器(MQ-2烟雾/火焰/DHT11温湿度/红外)

这里写目录标题**STM32物联网云监控智能报警器(烟雾/火焰/温湿度/红外)**一、开发环境二、主要功能三、原理图四、PCB图五、程序代码六、设计说明书(设计报告)七、器件清单八、资料清单&下载链接STM32物联网云监控智能报警器&…

作者头像 李华
网站建设 2026/4/27 23:00:31

AI给软件测试带来的5大机遇,错过一个都不应该!

01「 什么是人工智能(AI)?」 人工智能(Artificial Intelligence, AI)是一门集合了计算机科学、信息工程、心理学、哲学等多学科知识的研究领域,它旨在创建能够执行通常需要人类智能的任务的机器和软件。AI…

作者头像 李华