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

原创 2006年06月14日 16:28:00

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

 

 

 

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

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

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

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

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

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

C++ 多态 指针转换

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

如何用c语言实现多态

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

c++面向对象三大特征封装、继承和多态知识总结

面向对象三大特征:封装,继承,多态; 一、封装:该公开的就公开话,该私有的就隐藏掉,主要是由public,private实现;作用是便于分工和分模块,防止不必要的扩展; 二、继承:就是一种传承,可以把...
  • uestclr
  • uestclr
  • 2016年06月05日 18:23
  • 2777

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

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

C++ 多态 以及实现多态的三种方式

实实在在说多态(C++篇) 1.    什么是多态... 1 2.    多态带来的好处... 1 3.    C++中实现多态的方式... 1 4.    细说用函数重载实现的多...
  • lq296263775
  • lq296263775
  • 2014年09月02日 21:59
  • 765

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

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

初识GTK--C语言学习(6)

吐槽好想回家。。。。GTK是啥通俗的说,一个库,用C语言写出图形界面。GTK和普通的C程序有啥区别我想这是新手上来最坑爹的了,因为现有的大部分教程都是给个例子(好长的代码)然后发一个实际的效果,只能通...
  • XiyouLinux_Kangyijie
  • XiyouLinux_Kangyijie
  • 2016年08月05日 23:51
  • 737
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用C实现C++的多态---剖析GTK的"对象" (一)
举报原因:
原因补充:

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