能否单纯用C语言,用面向对象的思维来编程?
你可以实现简单的封装,和不带虚函数的单继承,成员函数用全局/局部函数+特殊的命名来界定一切对象用typedef出来的指针传递,模拟引用,继承就是在对象里写一个base成员
封装
class tag_vector { int* array; size_t count; }; typedef struct tag_vector* vector; void Vector_ctor(vector this, int len); void Vector_push_back(vector this, int value); void Vector_erase(vector this, size_t index); void Vector_dtor(vector this);
继承
struct base { int value1; }; struct derived { struct base __base; int value2; }; //成员函数还是那么写
总之想用C写面向对象,你就要把C++编译器替你生成的那些代码全都变成手写
至于多继承、虚函数、虚继承因为多继承和虚继承是编译器为你生成了大部分的隐藏代码,不仅仅是类成员函数的定义,还有代码中的隐式转换,虚函数的调用,如果你要把这部分全用C来手写的话,参考cfront和《深入探索C++对象模型》,你会发现这会很恶心。
理论上是可以的。因为有相当一部分面向对象语言是建立在C语言之上的(eg:obj-c,c++,Java)很多封装都是对C的语法糖。
可以的,C++的对象实际上也就是用数据+虚拟函数表,来实现面向对象的继承和多态等特性,所以用C语言只要能实现类似的结构就可以了,只不过受到语法的限制,实现起来没有这么好看而已。 brew平台里面有个比较好的用C语言实现面向对象的方法,这个blog里面讲的比较清楚,可以参考下,http://blog.chinaunix.net/uid-517401-id-353373.html
囿于语法的限制,纯C不能写出你现在所看到的那种oo编程,譬如class,interface等这些identity都会抛出语法错误,你可以利用有限的关键字,或者用结构体,巧妙的实现oo的思想,但那不够纯粹。先用c创造一个这样的环境,兼容c的语法规则,同时支持面对对象,这其实不是c了,这叫c++。或者更大胆一些,完全支持oo。那就是java了。
所以,纯c是写不出面向对象的,但它可以更新自己,用c语言重新写一个c的编译器使他支持oo。但实际上它早已不是那个原来的自己。
所以,如果你一定要这么做,为什么不试试c++了?
可以啊 我们有c with class
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
暂无简介
文章 0 评论 0
接受
发布评论
评论(5)
你可以实现简单的封装,和不带虚函数的单继承,成员函数用全局/局部函数+特殊的命名来界定
一切对象用typedef出来的指针传递,模拟引用,继承就是在对象里写一个base成员
封装
继承
总之想用C写面向对象,你就要把C++编译器替你生成的那些代码全都变成手写
至于多继承、虚函数、虚继承
因为多继承和虚继承是编译器为你生成了大部分的隐藏代码,不仅仅是类成员函数的定义,还有代码中的隐式转换,虚函数的调用,如果你要把这部分全用C来手写的话,参考cfront和《深入探索C++对象模型》,你会发现这会很恶心。
理论上是可以的。
因为有相当一部分面向对象语言是建立在C语言之上的(eg:obj-c,c++,Java)
很多封装都是对C的语法糖。
可以的,C++的对象实际上也就是用数据+虚拟函数表,来实现面向对象的继承和多态等特性,所以用C语言只要能实现类似的结构就可以了,只不过受到语法的限制,实现起来没有这么好看而已。 brew平台里面有个比较好的用C语言实现面向对象的方法,这个blog里面讲的比较清楚,可以参考下,http://blog.chinaunix.net/uid-517401-id-353373.html
囿于语法的限制,纯C不能写出你现在所看到的那种oo编程,譬如class,interface等这些identity都会抛出语法错误,你可以利用有限的关键字,或者用结构体,巧妙的实现oo的思想,但那不够纯粹。先用c创造一个这样的环境,兼容c的语法规则,同时支持面对对象,这其实不是c了,这叫c++。
或者更大胆一些,完全支持oo。那就是java了。
所以,纯c是写不出面向对象的,但它可以更新自己,用c语言重新写一个c的编译器使他支持oo。但实际上它早已不是那个原来的自己。
所以,如果你一定要这么做,为什么不试试c++了?
可以啊 我们有c with class