当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:54:00  来源:本站整理

解析动态联编(下篇)[VC/C++编程]

赞助商链接



  本文“解析动态联编(下篇)[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

三 虚函数表VTABLE

动态联编历程跟我们猜想的大致相同.编译器在执 行历程中碰到virtual关键字的时刻,将自动安装动态联编需求的机制,首先为这 些包含virtual函数的类(注意不是类的实例)--即便是祖先类包含虚函数而本身 没有--成立一张虚拟函数表VTABLE.在这些虚拟函数表中,编译器将顺次按照函 数声明次序安排类的特定虚函数的地址.同时在每个带有虚函数的类中安排一个 称之为vpointer的指针,简称vptr,这个指针指向这个类的VTABLE.

关于 虚拟函数表,有几点必须声明清楚:

1. 每一个类别只能有一个虚拟函数 表,假如该类没有虚拟函数,则不存在虚拟函数表.

2. C++编译时刻编译 器会在含有虚函数的类中加上一个指向虚拟函数表的指针vptr.

3. 从一 个类别诞生的每一个对象,将获得该类别中的vptr指针,这个指针一样指向类的 VTABLE.

因此类、对象、VTABLE的层次构造可以用下图表示.此中X类和Y 类的对象的指针 都指向了X,Y的虚拟函数表,同时X,Y类自身也包含了指向虚拟函 数的指针.

为了方 便问题阐明,我们将2.cpp例子举行扩大,扩大程序以下.//4.cpp
15. #include <iostream.h >
16. class shape{
17.  public:
18.  virtual void draw(){cout<<"shape::draw ()"<<endl;}
19.  virtual void area() {cout<<"shape::area()"<<endl;}
20.  void fun(){draw();area();}
21. };
22. class circle:public shape {
23. public:
24.  void draw() {cout<<"circle::draw()"<<endl;}
25.  void adjust(){cout<<"circle::adjust()"<<endl;}
26. };
27. main(){
28.  shape oneshape;
29.   oneshape.fun();
30.
31.  circle circleshape;
32.   shape& baseshape=circleshape;
33.  baseshape.fun();
34. }

编译器在编译上面这段代码的时刻将为这shape和circle两个对象 辨别成立一个VTABLE表,这些表顺次填充派生类对象和基类对象中声明的全部的 虚函数地址.假如派生类本身没有重新定义基类的虚函数,那么填充的就是基类 的虚函数地址.这样一旦假如函数调用一个派生类不存在的办法时刻可以自动调 用基类办法.然后编译器在每个类中安排一个vptr,普通置于对象的起始位置, 继而在对象的构造函数中将vptr初始化为本类的VTABLE的地址.整个后果筹划如 下.

图一


  以上是“解析动态联编(下篇)[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • <b>解析动态联编(上篇)</b>
  • 解析动态联编(下篇)
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        100%(1)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .