C 虚函数和动态联编技术分析

2008-02-23 05:24:48来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

面向对象程式设计的基本观点是用程式来仿真大千世界,这使得他的各种根本特性很人性化,如封装、继承、多态等等,而虚拟函数就是c 中实现多态性的主将。为了实现多态性,c 编译器也革命性地提供了动态联编(或叫晚捆绑)这一特征。

  虚拟函数亦是mfc编程的关键所在,mfc编程主要有两种方法:一是响应各种消息,进行对应的消息处理。二就是重载并改写虚拟函数,来实现自己的某些需要或改变系统的某些默认处理。

  虚函数的地位是如此的重要,对他进行穷根究底,力求能知其然并知其所以然 对我们编程能力的提高大有好处。下面且听我道来。

  多态性和动态联编的实现过程分析

  一、基础略(限于篇幅,请参阅相应的c 书籍):

  1、多态性:使用基础类的指针动态调用其派生类中函数的特性。

  2、动态联编:在运行阶段,才将函数的调用和对应的函数体进行连接的方式,又叫运行时联编或晚捆绑。

  二、过程描述:

  1、编译器发现一个类中有虚函数,编译器会立即为此类生成虚拟函数表 vtable(后面有对vtable的分析)。虚拟函数表的各表项为指向对应虚拟函数的指针。

  2、编译器在此类中隐含插入一个指针vptr(对vc编译器来说,他插在类的第一个位置上)。

  有一个办法能够让您感知这个隐含指针的存在,虽然您不能在类中直接看到他,但您能够比较一下含有虚拟函数时的类的尺寸和没有虚拟函数时的类的尺寸,您能够发现,这个指针确实存在。

  class cnovirtualfun
   {
    private:
    long lmember;
    public:
    long getmembervalue();
   } class chavevirtualfun
   {
    private:
     long lmember;
    public:
     virtual long getmembervalue();
    }

   cnovirtualfun obj;
   sizeof(obj) -> == 4;
   chavevirtualfun obj;
   sizeof(obj) -> == 8;


  3、在调用此类的构造函数时,在类的构造函数中,编译器会隐含执行vptr和vtable的关联代码,将vptr指向对应的vtable。这就将类和此类的vtable联系了起来。

  4、在调用类的构造函数时,指向基础类的指针此时已变成指向具体的类的this指针,这样依靠此this指针即可得到正确的vtable,从而实现了多态性。在此时才能真正和函数体进行连接,这就是动态联编。



[1] [2] 下一页

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: C 研发中数据结构和算法的分离

下一篇: 深入解析C 中的三个修饰符

热门词条
热门标签