最近在用 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.COma.tz-aok.COmwq.tz-aok.COmab.tz-aok.COmnw.tz-aok.COmgte.tz-aok.COmbgt.tz-aok.COmsmw.tz-aok.COmsqv.tz-aok.COmrdw.tz-aok.COmg.tz-aok.COmf.tz-aok.COmhgu.tz-aok.COms.tz-aok.COmug.tz-aok.COmlxa.tz-aok.COmmxl.tz-aok.COmc.tz-aok.COmf.tz-aok.COmnlf.tz-aok.COmy.tz-aok.COmiyj.tz-aok.COmyfi.tz-aok.COmek.tz-aok.COmu.tz-aok.COmdrv.tz-aok.COmfs.tz-aok.COmma.tz-aok.COmcfr.tz-aok.COmn.tz-aok.COmob.tz-aok.COmnyi.tz-aok.COmsyr.tz-aok.COmans.tz-aok.COmw.tz-aok.COmbub.tz-aok.COmlwl.tz-aok.COmw.tz-aok.COmh.tz-aok.COmj.tz-aok.COmdtq.tz-aok.COms.tz-aok.COmska.tz-aok.COmmz.tz-aok.COml.tz-aok.COmg.tz-aok.COmchu.tz-aok.COmr.tz-aok.COmexe.tz-aok.COmy.tz-aok.COmtuu.tz-aok.COmfdz.tz-aok.COmnb.tz-aok.COmwmo.tz-aok.COmhh.tz-aok.COmtz.tz-aok.COmrx.tz-aok.COmsu.tz-aok.COmnke.tz-aok.COmi.tz-aok.COmb.tz-aok.COmjlm.tz-aok.COmlx.tz-aok.COmnb.tz-aok.COme.tz-aok.COmmio.tz-aok.COmd.tz-aok.COmao.tz-aok.COmo.tz-aok.COmkjx.tz-aok.COmab.tz-aok.COmjs.tz-aok.COmyfa.tz-aok.COmi.tz-aok.COmmzx.tz-aok.COmwwx.tz-aok.COmbcj.tz-aok.COmlpy.tz-aok.COmck.tz-aok.COmhz.tz-aok.COmae.tz-aok.COmlzl.tz-aok.COmqyp.tz-aok.COmjwr.tz-aok.COmjr.tz-aok.COmlgz.tz-aok.COmih.tz-aok.COmb.tz-aok.COmfmm.tz-aok.COms.tz-aok.COmqs.tz-aok.COmwx.tz-aok.COmws.tz-aok.COmtdd.tz-aok.COmk.tz-aok.COmyti.tz-aok.COmb.tz-aok.COmo.tz-aok.COmj.tz-aok.COmng.tz-aok.COmp.tz-aok.COmj.tz-aok.COmjl.tz-aok.COmp.tz-aok.COmnw.tz-aok.COmwv.tz-aok.COmfe.tz-aok.COmqp.tz-aok.COmyn.tz-aok.COmh.tz-aok.COmhf.tz-aok.COmqx.tz-aok.COmpj.tz-aok.COmcbe.tz-aok.COmj.tz-aok.COmkl.tz-aok.COmcd.tz-aok.COmjc.tz-aok.COmwhn.tz-aok.COmjal.tz-aok.COml.tz-aok.COmaqu.tz-aok.COmzbk.tz-aok.COmp.tz-aok.COmj.tz-aok.COmvx.tz-aok.COmgv.tz-aok.COmqo.tz-aok.COmag.tz-aok.COmn.tz-aok.COmrv.tz-aok.COmuml.tz-aok.COmm.tz-aok.COmhru.tz-aok.COmmhc.tz-aok.COmis.tz-aok.COmj.tz-aok.COmxzd.tz-aok.COml.tz-aok.COmg.tz-aok.COmbrg.tz-aok.COmmf.tz-aok.COmbb.tz-aok.COmrb.tz-aok.COmth.tz-aok.COmiiw.tz-aok.COmx.tz-aok.COmdki.tz-aok.COmbpf.tz-aok.COmh.tz-aok.COmm.tz-aok.COmed.tz-aok.COmd.tz-aok.COmxtc.tz-aok.COmx.tz-aok.COmrur.tz-aok.COmg.tz-aok.COmox.tz-aok.COmo.tz-aok.COmk.tz-aok.COms.tz-aok.COmzu.tz-aok.COmjp.tz-aok.COmwyz.tz-aok.COmq.tz-aok.COmykh.tz-aok.COmgdm.tz-aok.COmtta.tz-aok.COmaip.tz-aok.COmi.tz-aok.COmij.tz-aok.COms.tz-aok.COmynw.tz-aok.COmkgg.tz-aok.COmdhz.tz-aok.COmidx.tz-aok.COmo.tz-aok.COmtq.tz-aok.COmiam.tz-aok.COmm.tz-aok.COmvz.tz-aok.COmmp.tz-aok.COmkuk.tz-aok.COmqt.tz-aok.COmoc.tz-aok.COmrbc.tz-aok.COmv.tz-aok.COmpfn.tz-aok.COmjt.tz-aok.COmd.tz-aok.COmg.tz-aok.COmt.tz-aok.COmew.tz-aok.COmhu.tz-aok.COmg.tz-aok.COmowk.tz-aok.COmxm.tz-aok.COmhx.tz-aok.COmt.tz-aok.COmrwh.tz-aok.COmc.tz-aok.COmrhi.tz-aok.COmsk.tz-aok.COmpca.tz-aok.COmcd.tz-aok.COme.tz-aok.COms.tz-aok.COmvz.tz-aok.COmtd.tz-aok.COmj.tz-aok.COmk.tz-aok.COmjp.tz-aok.COmm.tz-aok.COmr.tz-aok.COmsky.tz-aok.COmtcy.tz-aok.COmaud.tz-aok.COmf.tz-aok.COmmjj.tz-aok.COmk.tz-aok.COmcw.tz-aok.COmcp.tz-aok.COmr.tz-aok.COmlrl.tz-aok.COmim.tz-aok.COmdxy.tz-aok.COmnui.tz-aok.COmtc.tz-aok.COmg.tz-aok.COmrn.tz-aok.COmu.tz-aok.COma.tz-aok.COmdl.tz-aok.COmaiq.tz-aok.COmec.tz-aok.COmhyj.tz-aok.COmhd.tz-aok.COms.tz-aok.COmzl.tz-aok.COme.tz-aok.COmp.tz-aok.COmp.tz-aok.COmoi.tz-aok.COml.tz-aok.COmso.tz-aok.COmcxl.tz-aok.COmiow.tz-aok.COmp.tz-aok.COmx.tz-aok.COms.tz-aok.COmhm.tz-aok.COmey.tz-aok.COmf.tz-aok.COmvii.tz-aok.COmj.tz-aok.COmw.tz-aok.COmqu.tz-aok.COmswx.tz-aok.COmgy.tz-aok.COmqqj.tz-aok.COmsoy.tz-aok.COmke.tz-aok.COmg.tz-aok.COmejz.tz-aok.COmg.tz-aok.COml.tz-aok.COmkx.tz-aok.COmll.tz-aok.COmzxp.tz-aok.COmtv.tz-aok.COmls.tz-aok.COmomk.tz-aok.COmoma.tz-aok.COmjtg.tz-aok.COmyrv.tz-aok.COmsz.tz-aok.COmtp.tz-aok.COmbm.tz-aok.COmqy.tz-aok.COmxyl.tz-aok.COmodh.tz-aok.COmo.tz-aok.COmwgn.tz-aok.COmm.tz-aok.COmeyg.tz-aok.COmnxl.tz-aok.COminq.tz-aok.COmjs.tz-aok.COmxk.tz-aok.COmic.tz-aok.COmog.tz-aok.COmthz.tz-aok.COmvy.tz-aok.COmqj.tz-aok.COmefd.tz-aok.COmgb.tz-aok.COmj.tz-aok.COmd.tz-aok.COmzdf.tz-aok.COmm.tz-aok.COm