关闭

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

1709人阅读 评论(1) 收藏 举报

用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)

 

 

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:42972次
    • 积分:625
    • 等级:
    • 排名:千里之外
    • 原创:17篇
    • 转载:2篇
    • 译文:0篇
    • 评论:6条
    最新评论