虚表~

来源:互联网 发布:阚清子欣荣格格和知画 编辑:程序博客网 时间:2024/05/29 00:31

虚表(vtable)一直都好像很神秘的样子,今天工作中涉及到虚表,就做下一些记录吧~

1.每一个拥有虚函数的类都有一个虚表,注意是虚函数。

2.虚表实际上是一个函数指针数组,记录了本类所有虚函数的地址。当类对象调用虚函数时,会根据对应关系从虚表中获得虚函数指针,再去执行函数,这种行为称为晚绑定。

3.子类的虚表继承了父类的虚表,如果父类vtable中包含某一项,则子类的vtable中也将包含同一项,但两项的值可能不同;如果子类重写了虚函数,则派生类的vtable的该项指向重写后的虚函数,否则沿用父类的值。

4.每一个类只有唯一的一个vtable,并非每个类的对象都有一个vtable,但每个类的对象都有一个指针指向vtable。

5.在类对象的内存布局中,首先是该类的vtable指针,然后才是对象数据。

一些疑问:

问:没有虚函数的类的对象也会有指向虚表的指针吗?。

答:没有虚函数的类都没有虚表,大哥。

问:怎么通过虚表理解多态?

答:当类对象调用虚函数时,是通过该对象的指向虚表的指针来获得虚函数进而调用函数。注意上一句话的该对象,所以说基类的指针指向的是基类的对象时,就会通过基类的对象的虚指针来获得基类虚函数地址,当基类的指针指向子类对象的时候就会通过子类对象的虚指针获得子类的虚函数地址调用函数。就这样。

问:普通成员函数的地址又是存放在哪?函数的定义呢?

答:在编译器编译时在将函数放在内存的代码段中。

问:虚表是在什么时候被创建?

答:编译器在编译的时候,发现类中有虚函数,则为该类创建一个虚表;而指向虚表的虚指针是在构造函数中被创建。

原创粉丝点击