俺使用的C语言面向对象范式(第四节:多态的实现 与 总结)

来源:互联网 发布:linux里面涉及到单词 编辑:程序博客网 时间:2024/05/01 16:14

四、 多态的实现


    在C++中多态有两种,编译时多态,与运行时多态。
    而编译时多态指的是函数重载与运算符重载。编译时多态是主要是根据类型识别来实现的,是C++编译器在编译过程中完成的。既然C语言编译器原生就没有编译时多态的功能,那么要在C语言实现重载就必须借助于运行时的类型信息。
    C语言在结构中插入运行信息的方法要么是:1.在结构体定义一个类型变量,保存对象的类型信息
    2.在结构体定义一个指针,指向一个"类类型"的结构体
    不管是前者还是后者,俺觉得都属于“C语言偏僻技巧”,所以放弃了重载的实现。

    再说运行时多态,C++中的运行时多态指的就是虚函数。C++编译器实现虚函数就是在对象前头插入了个vtable,虚函数表。而我们先前在接口相关的定义中已经定义了函数表,下面俺就利用这个函数表来实现虚函数。

定义接口Iface:

定义个基类:

定义两个类ClassA和ClassB

重载Iface的两个函数init和dosomething,
实际上就是为struct Iface的两个结构体 i_face_for_ClassA, i_face_for_ClassB
填入不同的参数~~

为ClassA创建一个接口实例:

为ClassB创建一个接口实例:

分别实例化ClassA与ClassB:

试试多态 :)


小结:
    虽然不愿意使用继承的关系,但是虚函数总是伴随着继承关系出现的。在实际运用多态性时,很可能需要在虚函数中进行类型的转换。这里就不作讨论了。。。

 

 

五、总结
    不要说没可能在C语言里用面向对象的编程手法。不管是俺因为嵌入式、运行环境的限制,还是自己要写个动态语言。
    很著名的一个例子就是PYTHON,PYTHON的原始版本就是用C实现的。在PYTHON解释器的源代码中,
    每个数据类型都是一个对象,每个对象由一个结构体表示。而这个结构体里边用了宏的封装办法,也用了指向父类的指针。
    虽然人家用了“C语言的偏僻技巧”,可人家是牛人呀,咱不能跟人比。。。


参考:

1.博客文章:《我所偏爱的 C 语言面向对象编程范式》   云风的BLOG
2.程序代码:《LW_OOPC》        http://sourceforge.net/projects/lwoopc/
3.图书:《Object-oriented Programming with ANSI-C》
4.图书:《Python源码剖析》

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 oppo媒体声音小怎么办 手机视频音量小怎么办 苹果6内存不够怎么办 wiwox7忘记密码了怎么办 wiwo手机声音小怎么办 海信手机声音小怎么办 ppos手机声音小怎么办 手机铃声太小怎么办 手机声音没有了怎么办 vivo外放没声音怎么办 fgo关服充的钱怎么办 淘宝提前收货了怎么办 淘宝直播间没人怎么办 花呗地区限制怎么办 支付宝花呗账单错误怎么办 台球厅生意惨淡怎么办 退货少了东西怎么办 微店注册id怎么办 卖红酒没有客源怎么办 来姨妈10天没走怎么办 京东违反广告法怎么办 支付宝定位错误怎么办 银行账户未年审怎么办 淘宝集运禁运品 怎么办 物流显示禁运品怎么办 淘宝禁运品怎么办呢 货物退回日本了怎么办 淘宝卖家寄多了衣服怎么办 集运地址选错怎么办 淘宝卖韩国化妆品退货怎么办 去韩国留学手机怎么办 韩国办无线网怎么办 淘宝卖家被骗怎么办 淘宝买软件被骗怎么办 被淘宝店诈骗怎么办? 支付宝被骗2000怎么办 给私人打款后不发货怎么办 毕业证寄丢了怎么办 微商下单返现被骗一千四怎么办 淘宝买东西卡里多扣钱怎么办 付款了卖家不发货怎么办