用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语言实现C++面向对象语言多态特性

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

如何用C语言实现类似C++中的多态

先引用一篇博文,讲讲什么是多态: C++编程语言是一款应用广泛,支持多种程序设计的计算机编程语言。我们今天就会为大家详细介绍其中C++多态性的一些基本知识,以方便大家在学习过程中对此能够有一个充分的...
  • samuel_chen
  • samuel_chen
  • 2014年12月12日 14:42
  • 1219

C语言模拟实现C++的继承与多态

一、面向过程编程与面向对象编程的区别 众所周知,C语言是一种典型的面向过程编程语言,而C++确实在它的基础上改进的一款面向对象编程语言,那么,面向过程与面向对象到底有什么样的区别呢?【...
  • snow_5288
  • snow_5288
  • 2017年04月16日 21:28
  • 1176

C语言模式实现C++继承和多态

这个问题主要考察的是C和C++的区别,以及C++中继承和多态的概念。C和C++的区别C语言是面向过程的语言,而C++是面向对象的过程。什么是面向对象和面向过程? 面向过程就是分析解决问题的步骤,然后用...
  • wenqiang1208
  • wenqiang1208
  • 2017年07月28日 12:36
  • 707

如何用c语言实现多态

前几天在小组无意见听到学姐说到c语言实现多态这个词,比较感兴趣,欢迎一起讨论哈。 提前说一下,c实现多态算是一个奇怪的用法吧,而且不是完全的多态,并不通用,也不推荐用。感兴趣的可以了解下 我们都知...
  • wwh578867817
  • wwh578867817
  • 2015年04月17日 19:24
  • 2368

C++多态的实现方式总结

实现多态有两种方法: 1、覆盖 *********** 覆盖是指子类重新定义父类的虚函数的做法。 2、重载 *********** 重载是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数...
  • sinat_20265495
  • sinat_20265495
  • 2015年11月30日 14:45
  • 3079

C++ 多态 指针转换

class A{ public: A(); virtual ~A();};class B{ public: B(); virtual ~B();};class C : public A...
  • CNHK1225
  • CNHK1225
  • 2015年10月21日 16:03
  • 761

C++虚函数详解&实现机制&多态性

转载:http://blog.chinaunix.net/uid-24178783-id-370328.html
  • tcherry
  • tcherry
  • 2014年10月07日 15:03
  • 1084

C++的多态与虚函数

多态的作用:继承是子类使用父类的方法,而多态则是父类使用子类的方法。 在C++中,多态有两种,一种是函数重载,一种是虚函数。函数重载发生在编译的时候,它的函数参是不一样的。而虚函数是发生在运行的时候,...
  • chencheng126
  • chencheng126
  • 2015年01月06日 21:49
  • 1732

C++的封装、多态、继承在C中的对应实现方式

C++的特点:封装、多态、继承 1.封装是面向对象最重要的特征之一(C++中的类class),封装就是指隐藏。 对象隐藏了数据(例如private属性),避免了其他对象可以直接访问使用对象属性而...
  • yyf_it
  • yyf_it
  • 2016年08月11日 17:40
  • 688
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用C实现C++的多态---剖析GTK的"对象" (四)
举报原因:
原因补充:

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