解析动态联编(下篇)[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++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
- ·上一篇文章:列举系统设备
- ·下一篇文章:<b>解析动态联编(上篇)</b>
- ·中查找“解析动态联编(下篇)”更多相关内容
- ·中查找“解析动态联编(下篇)”更多相关内容