用C实现C++的多态---剖析GTK的"对象" (一)
一. 前言
前一段时间用到GTK图形库,对它的C语言实现的面像对象概念很感兴趣,在这里写下自己的一点见解,
同时也是理理自己的思路。
二. C++中的多态
class A {
virtual void output(void) { prinf("this is A/n"); }
virtual void func(void);
};
class B : public A {
void output(void) { printf("this is B/n"); }
};
A *a = new B();
大家知道,这时候调用a->output()会输出"this is B",这就是C++的多态。
这里首先要明确两个名词,对象、实例。对象就是A、B,用A或B创建出来的a称之为实例
那么,实例a为什么会调用对象B的output呢?这是因为一个对象有且只有一个虚函数指针,
指向这个对象的全部虚函数的入口点。大家可以这样验证一下, 把class A再加一个虚函数test(void):
class AA{
virtual void output(void) { prinf("this is A/n"); }
virtual void func(void);
virtual void test(void);
};
测一下sizeof(A) 和 sizeof(AA)的大小应该是相等的。说明所有的虚函数用同一个指针来指向的。
三. 用C定义基类(基对象)
typedef struct _CObject CObject;
typedef struct _CObjectClass CObjectClass;
struct _CObject{ /*基类CObject*/
CObjectClass *class; /*同C++中的虚函数指针*/
int ref_counter;
};
struct _CObjectClass{
void (*contruct)(CObject *object);/*虚函数--构造函数*/
void (*destory)(CObject *object); /*虚函数--析构函数*/
};
现在,CObject对象有两个虚函数,构造函数和析构函数。
(to be continued)