俺使用的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源码剖析》
- 俺使用的C语言面向对象范式(第四节:多态的实现 与 总结)
- 俺使用的C语言面向对象范式(第二节:构造Composition 与 第三节:继承Inheritance)
- 俺使用的C语言面向对象范式(前言与第一节:一个简单类的封装)
- 模仿go语言的C语言面向对象范式
- 我所偏爱的 C 语言面向对象编程范式
- 我所偏爱的 C 语言面向对象编程范式
- 我所偏爱的 C 语言面向对象编程范式
- C语言中的面向对象(2)-C语言的多态实现(转载)
- 使用C语言实现面向对象的方法
- 如何使用C语言实现面向对象的设计
- C语言实现面向对象的思想(实现封装、继承和多态)
- C语言面向对象的实现
- C语言面向对象的实现---多态性
- C语言实现面向对象的思想
- C语言中的面向对象-C语言的多态实现
- C语言面向对象的思想(实现继承和多态)
- objective-c自学总结(三)---面向对象的封装,继承与多态
- C语言的面向对象
- sprintf与sscanf的区别
- 【转】S3C2440上LCD驱动(FrameBuffer)实例开发讲解(1)
- eclipse 开发web项目
- VMware Workstation unrecoverable error (disk error while paging) has occurred
- Android 中的 adapter
- 俺使用的C语言面向对象范式(第四节:多态的实现 与 总结)
- java写的三个求乘法逆元的算法
- 第七章 linux文件与目录管理
- jsp页面中导出word文档
- this.getHibernateTemplate()为null
- Jasperreport
- weblogic发布webservice项目报错
- Android简明开发教程十一:自定义Adapter显示列表
- Socket编程中用send发送结构体