关闭

用C实现C++的多态

发表于:2009-12-28 13:02

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

#
DotNet

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

  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<MAX_CLASS_NUM-1;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()

31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号