[讨论]用纯C如何实现面像对象(oop), 见者有分!
希望高手们谈谈想法.共同学习,共同进步.
[解决办法]
这是我曾经发的帖子,里面的很多回复很有参考价值:http://topic.csdn.net/u/20090418/17/40711856-e144-4281-b1fc-7d44d545e59f.html
[解决办法]
去看LINUX源码
[解决办法]
纯C本来是不支持面向对象的理念的!!
如果想让它面向对象;就要用struct,
里面可以放一些数据成员和函数指针
调用起来有点面向对象的意思
[解决办法]
比较容易想到的就是结构体,里面有函数指针
这些函数的第一个参数是结构体的指针
这样来模拟this指针。
还有比较深入的可以再想想,比如多态
[解决办法]
用struct,用函数指针作为结构体struct的成员.
[解决办法]
呵呵。。。没想过这个方面的。。。
[解决办法]
纯C本来是不支持面向对象的理念的!!
如果想让它面向对象;就要用struct,
里面可以放一些数据成员和函数指针
调用起来有点面向对象的意思
可是他,不支持虚函数之类的,还有运算符重载
[解决办法]
纯C本来是不支持面向对象的理念的!!
如果想让它面向对象;就要用struct,
里面可以放一些数据成员和函数指针
调用起来有点面向对象的意思
可是他不支持 多态,就是虚函数。还有运算符重载!
[解决办法]
学习...
[解决办法]
面向对象三大特征:
1. 封装 -----> struct,加上函数指针可以作为成员函数用
2. 继承 -----> 主要是高重用性,在C中可以采用struct组合的方式提高重用
3. 多态 -----> 自己可以维护一张虚函数表,管理函数指针
[解决办法]
支持这个帖子,看了一下,确实很不错,学习了。
#include <stdio.h>#include <stdlib.h>#define GET_VTBL(p,type) ((type*)(void*)p)->pvttypedef struct Base Base;typedef struct BaseVtable{ void (*test1)(Base*); void (*test2)(Base*);//创建虚表}BaseVtable;typedef struct Base{ BaseVtable* pvt; }Base;#define INHERIT_Base(name) \ void (*test1)(name*); \ void (*test2)(name*) void Basetest1(Base *p) { printf("------------------------------------\n"); printf("This is Base'test1() function\n"); printf("------------------------------------\n");}void Basetest2(Base *p) { printf("------------------------------------\n"); printf("This is Base'test2() function\n"); printf("------------------------------------\n");}#define CreatObject(p,type) \ //为对象分配空间,初始化虚表 p = (Base*)malloc(sizeof(type));\ p->pvt=(BaseVtable*)malloc(sizeof(BaseVtable));\ p->pvt->test1 = type##test1;\ p->pvt->test2 = type##test2typedef struct DeriveVtable{ INHERIT_Base(Base); //简单模拟面向对象的 继承特性}DeriveVtable;typedef struct Derive{ DeriveVtable* pvt; int a; int b;}Derive;void Derivetest1(Base *p) { printf("------------------------------------\n"); ((Derive*)p)->a=1; ((Derive*)p)->b=2; printf("This is Derive'test1() function\n"); printf("------------------------------------\n");}void Derivetest2(Base *p) { printf("------------------------------------\n"); printf("a=%d,b=%d\n",((Derive*)p)->a,((Derive*)p)->b); printf("This is Derive'test2() function\n"); printf("------------------------------------\n");}#define Invoke_Test1(p) GET_VTBL(p,Base)->test1((Base*)p);#define Invoke_Test2(p) GET_VTBL(p,Base)->test2((Base*)p);int main(){ Base *p = 0; CreatObject(p,Base); Invoke_Test1(p); Invoke_Test2(p); free(p); CreatObject(p,Derive); Invoke_Test1(p); //基类指针指向子类,函数调用的子类的,模拟多态~~~ Invoke_Test2(p); system("pause");}
[解决办法]
学习~
[解决办法]
typedef struct IUnknownVtbl { BEGIN_INTERFACE HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IUnknown * This, /* [in] */ REFIID riid, /* [iid_is][out] */ void **ppvObject); ULONG ( STDMETHODCALLTYPE *AddRef )( IUnknown * This); ULONG ( STDMETHODCALLTYPE *Release )( IUnknown * This); END_INTERFACE } IUnknownVtbl; interface IUnknown { CONST_VTBL struct IUnknownVtbl *lpVtbl; };
[解决办法]
用结构体吧
[解决办法]
第一个oo的编译器是什么写的 ?
[解决办法]
struct
[解决办法]
菜鸟来学习一下
[解决办法]
应该用struct+point
[解决办法]
分享了!
[解决办法]
学习了
[解决办法]
mark
学习了
我读过用C实现面向对象
但是本人英文一般
再加上专业知识不足
没怎么理解
我感觉语言只是工具
面向对象是一种设计模式
用C去实现面向对象可能会比较复杂
[解决办法]
学习了~
[解决办法]
学习。为什么还要这么费事呢?
[解决办法]
我以前考《程序员》的时候 有个程序填空题 那程序代码所写的就是一个用C实现C++
我已经忘了我哪一年考的《程序员》 好像是05年
你可以去网上找找当年的试题
[解决办法]