设为首页 加入收藏

TOP

用C实现C++的多态
2014-11-23 20:29:12 】 浏览:8285
Tags:实现

  我们用下面的结构来描述一个对象:


  typedef struct _ClassType


  {


  char* name; /*对象名,唯一*/


  int object_size;/*对象大小,创建实列时分配内存要用到*/


  int class_size; /*全部虚函数大小,如sizeof(CObjectClass)*/


  void* vclass; /*虚函数指针*/


  void (*InitClassCallback)(void*); /*给对象的虚函数赋值*/


  void (*InitObjectCallback)(void*);/*对象实例化时,给实例成员赋初值,有点类似构造函数*/


  struct _ClassType* parent; /*父对象*/


  struct _ClassType* next; /*单向链表,指向下一对象*/


  }ClassType;


  #define [MAX_CLASS_NUM 128


  static ClassType classes[MAX_CLASS_NUM]; /*对象池*/


  static ClassType *used_classes = NULL;


  static ClassType *free_classes = NULL;


  这里只定义了128个对象,数目可能修改或者改成动态分配。


  初始化,全部链接到空闲链表中。


  void InitObjectLib(void)


  {


  int i;


  memset(classes, 0, sizeof(ClassType)*MAX_CLASS_NUM);


  for( i=0;i


  {


  classes[i].next = &(classes[i+1]);


  }


  free_classes = &(classes[0]);


  }


  这个函数既是获取对象的虚函数指针,也是注册对象。


  这里要注意type为static,一个对象只注册一次,下次获取时直接取type。


  RegisterClassType()第一个参数为对象的描述信息,第二个参数为父对象的函数指针,我们来看一下它的定义:


  #define TOP_OBJECT_TYPE 0


  #define BASE_OBJECT_TYPE GetObjectType()


  因为CObject为基对象,它没有父对象,所以这里第二个参数为0(TOP_OBJECT_TYPE)。


  现在假设有一个CObject子对象CSubObject,那么注册它时应该这样写:


  type = RegisterClassType(&classinfo, BASE_OBJECT_TYPE);


  由此可能看到,这里其实是一个递归:当注册CSubOject里会用到参数BASE_OBJECT_TYPE,既GetObjectType(),这样就可以把CObject也注册上。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C#和C++混合编程 下一篇VC中如何建立一个UNICODE应用程序

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目