动态联编学习:三、虚函数表VTABLE
来源:互联网 发布:有线网络打印 编辑:程序博客网 时间:2024/05/12 17:51
编译器在执行过程中遇到virtual关键字的时候,将自动安装动态联编需要的机制,首先为这些包含virtual函数的类(注意不是类的实例)--即使是祖先类包含虚函数而本身没有--建立一张虚拟函数表VTABLE。在这些虚拟函数表中,编译器将依次按照函数声明次序放置类的特定虚函数的地址。同时在每个带有虚函数的类中放置一个称之为vpointer的指针,简称vptr,这个指针指向这个类的VTABLE。
关于虚拟函数表,有几点必须声明清楚:
1. 每一个类别只能有一个虚拟函数表,如果该类没有虚拟函数,则不存在虚拟函数表。
2. C++编译时候编译器会在含有虚函数的类中加上一个指向虚拟函数表的指针vptr。
3. 从一个类别诞生的每一个对象,将获取该类别中的vptr指针,这个指针同样指向类的VTABLE。
因此类、对象、VTABLE的层次结构可以用下图表示。其中X类和Y类的对象的指针都指向了X,Y的虚拟函数表,同时X,Y类自身也包含了指向虚拟函数的指针。
编译器在编译上面这段代码的时候将为这shape和circle两个对象分别建立一个VTABLE表,这些表依次填充派生类对象和基类对象中声明的所有的虚函数地址。如果派生类本身没有重新定义基类的虚函数,那么填充的就是基类的虚函数地址。这样一旦如果函数调用一个派生类不存在的方法时候能够自动调用基类方法。然后编译器在每个类中放置一个vptr,一般置于对象的起始位置,继而在对象的构造函数中将vptr初始化为本类的VTABLE的地址。
C++ 编译程序时候按下面的步骤进行工作:
(1)为各类建立虚拟函数表,如果没有虚函数则不建立。
(2)暂时不连接虚函数,而是将各个虚函数的地址放入虚拟函数表中。
(3)直接连接各静态函数。
执行时候,诞生了oneshape和circleshape两个对象,oneshape对象的vptr指针指向shape的VTABLE,circleshape对象的vptr指针指向circleshape的VTABLE,在执行oneshape.fun()的时候,fun函数的this指针指向了oneshape对象,进入fun()之后程序继续执行this->draw(),由于this指向oneshape对象,oneshape的vptr又指向shape类的VTABLE,这样就从VTABLE中得到需要绑定的函数的地址,并连接起来。同样,this-> area()也经由oneshape对象而连接到相应的函数上,如图。
现在我们执行baseshape.fun()。
函数进入fun函数之后,函数的this指针将指向basefun对象,另一方面basefun指向一个circleshape,因此this指针指向的实际上为circleshape对象,而circleshape的vptr指针指向circle类的虚拟函数表,这样编译器将从虚拟表中取出circle::draw()和circle::area()的地址,进行连接。因为circle本身没有重新定义area()方法,因此编译器使用shape的area()方法。如图:
- 动态联编学习:三、虚函数表VTABLE
- C++多态篇1一静态联编,动态联编、虚函数与虚函数表vtable
- C++多态篇1一静态联编,动态联编、虚函数与虚函数表vtable
- 虚函数&动态联编
- 虚函数学习(静态联编,动态联编,多态,构造,虚析构,delete)
- 虚函数及静态联编与动态联编---学习笔记
- C++动态绑定和虚函数表vtable (动态实现原理)
- C++ 虚函数、静态联编、动态联编
- 多态性之动态联编 虚函数
- C++虚函数与动态联编
- 动态联编与虚函数
- C++虚函数与动态联编
- C++中的动态联编/静态联编及虚函数表
- 虚函数与VTABLE
- 动态联编学习:一、多态性和动态联编
- 虚函数(虚函数表vtable)的实现
- 详细介绍C++中的虚函数和动态联编
- 详细介绍C++中的虚函数和动态联编
- 用户体验的76点
- fisixengine 物理引擎
- Javascript静态分页(多个资料,静态自动分页)
- UML user guide, chapter 3 Hello world
- 编写完成端口网络服务器的一些说明
- 动态联编学习:三、虚函数表VTABLE
- Java中的特殊字符常量
- dos命令
- Tomcat详解
- Java 泛型的理解与等价实现
- [转]DirectInput 键盘编程入门
- Hibernate里插入oracle数据出现:ORA-01747: invaid user.table.column, table.column, or column specification
- JavaScript 编辑table
- 应用最广的十大Javascript框架