用C实现C++的多态---剖析GTK的"对象" (四)

原创 2006年06月15日 10:07:00

七. 写自己的子对象

/**************************************************************

 子对象RenderObject,继承于CObject-------render_object.h

***************************************************************/

#ifndef _H_RENDER_OBJECT_H_
#define _H_RENDER_OBJECT_H_


#define RENDER_OBJECT_TYPE   GetRenderObjectType()
#define IS_RENDER_OBJECT_TYPE(obj) IsObjectType(obj,RENDER_OBJECT_TYPE)
#define RENDER_OBJECT_CLASS(obj) ((RenderObjectClass*)GetObjectClass(obj))

typedef struct _RenderObject  RenderObject;
typedef struct _RenderObjectClass RenderObjectClass;


#ifdef __cplusplus
extern "C" {
#endif


enum
{
 RENDER_BOX  = 1,
 RENDER_TEXT 
};

struct _RenderObject
{
 CObject   base; 
 RenderObject* parent;
 RenderObject* children;
 RenderObject* prev;
 RenderObject* next;
 unsigned short x;
 unsigned short y;
 unsigned short width;
 unsigned short height;
 unsigned short min_width;
 unsigned short max_width;
 unsigned char  render_type;
 unsigned char  have_calc_width:1;
 unsigned char  have_calc_height:1;
 unsigned char  have_layout:1;
 unsigned char  reserved:5; 
};

struct _RenderObjectClass
{
 CObjectClass base;

 void (*draw)(void*);
 int (*calc_width)(void*);
 int (*calc_height)(void*);
 int (*calc_WxH)(void*);
 int (*layout)(void*);
};


int
GetRenderObjectType(void);

RenderObject *
NewRenderObject(void);

void
renderDraw(RenderObject *render);

int
renderCalcWidth(RenderObject *render);

int
renderCalcHeight(RenderObject *render);

int
renderCalcWxH(RenderObject *render);

int
renderLayout(RenderObject *render);

#ifdef __cplusplus
}
#endif
#endif

 

 

/**************************************************************

 子对象RenderObject,继承于CObject-------render_object.c

***************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "render_object.h"


static void
InitRenderObjectClass(RenderObjectClass *vclass)
{
 if(vclass==NULL)
  return;

 vclass->draw = renderDraw;
 vclass->calc_width = renderCalcWidth;
 vclass->calc_height = renderCalcHeight;
 vclass->calc_WxH = renderCalcWxH;
 vclass->layout = renderLayout;
}

static void
InitRenderObject(RenderObject *object)
{
 if(object==NULL)
  return;

 object->x = 0;
 object->y = 0;
 object->width = 0;
 object->height = 0;
 object->min_width = 0;
 object->max_width = 0;
 object->parent = NULL;
 object->children = NULL;
 object->prev = NULL;
 object->next = NULL;
 object->render_type = RENDER_BOX;
 object->have_calc_width = 0;
 object->have_calc_height = 0;
 object->have_layout = 0;
}

int
GetRenderObjectType(void)
{
 static int type = 0;

 if( type==0 )
 {
  static ClassInfo classinfo =
  {
   "RENDEROBJECT",
   sizeof(RenderObject),
   sizeof(RenderObjectClass),
   (pInitObjectCallback)InitRenderObject,
   (pInitClassCallback)InitRenderObjectClass,
  };

  type = RegisterClassType(&classinfo, BASE_OBJECT_TYPE);
 }

 return type;
}


RenderObject*
NewRenderObject(void)
{
 return (RenderObject*)NewClassType(RENDER_OBJECT_TYPE);
}

void
renderDraw(RenderObject *render)
{
}

int
renderCalcWidth(RenderObject *render)
{
 return 0;
}

int
renderCalcHeight(RenderObject *render)
{
 return 0;
}

int
renderCalcWxH(RenderObject *render)
{
 return 0;
}

int
renderLayout(RenderObject *render)
{
 return 0;
}

相关文章推荐

C++对象布局及多态实现

  • 2008年05月12日 20:35
  • 34KB
  • 下载

C/C++:面向对象编程特性:多态(虚函数表原理)

#include #include using namespace std; //定义两个函数指针类型 typedef void(*pFunc)(void); typedef int(*pSum...
  • jiezhj
  • jiezhj
  • 2014年08月05日 14:54
  • 508

面向对象多态c++

  • 2013年04月16日 07:56
  • 436KB
  • 下载

C++ —面向对象之多态的实现与应用

多态 今天我们的主角就是多态了,那么什么多态呢?多态有什么用? 多态性可以简单地概括为“一个接口,多种方法”,程序在运行时才决定调用的函数,它是面向对象编程...
  • Dawn_sf
  • Dawn_sf
  • 2017年04月05日 09:49
  • 550

C++对象布局及多态实现的探索(六)

C++对象布局及多态实现的探索(六) 后记   结合前面的讨论,我们可以看到,只要牵涉到了虚继承,在访问父类的成员变量时生成的代码相当的低效,需要通过很多间接的计算来定位成员变量的...
  • ilvu999
  • ilvu999
  • 2012年09月05日 00:14
  • 572

C语言实现C++面向对象语言多态特性

我们知道,C++语言演化过程中,加入了不少新特性,使其成为一门现代高级OO语言。当初C++在上个世纪七十年代末,80年代初时,C++发展刚刚起步,那时C++可以看作C with class,C++编写...

C++对象布局及多态实现的探索

虚函数的类的对象布局(1)     如果类中存在虚函数时,情况会怎样呢?我们知道当一个类中有虚函数时,编译器会为该类产生一个虚函数表,并在它的每一个对象中插入一个指向该虚函数表的指针,通常这个指...
  • kannju
  • kannju
  • 2011年09月01日 15:40
  • 380

C++ 面向对象(四)—— 多态 (Polymorphism)

为了能更好的理解本节内容,你需要清楚的知道怎样使用指针pointers 和类之间的继承 inheritance between classes。建议如果你觉得以下这些表达式比较生疏的的话, 请复习指定...

<C/C++基础> 多态实现机制

1 什么是多态? 多态性可以简单的概括为“1个接口,多种方法”,在程序运行的过程中才决定调用的机制 程序实现上是这样,通过父类指针调用子类的函数,可以让父类指针有多种形态。 2 实现机制 举一个例子:...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用C实现C++的多态---剖析GTK的"对象" (四)
举报原因:
原因补充:

(最多只允许输入30个字)