虚函数表!!!!

通过虚函数可以实现多态,即通过指针可以找到对象的虚函数,这是因为创建对象的时候增加了虚函数表。
ps:当对象中有虚函数时,内存中存的第一个数据是一个指向虚函数表的地址。(当计算对象大小时需要注意含不含虚函数)另外如果一个类中什么都没有,这个类创建出来的对象大小为1。

当一个类中有虚函数时,在创建该类对象时会额外创建一个数组,数组中的
每一个元素都是一个虚函数的入口地址,通过这个地址可以找到虚函数。
这个数组和对象的成员变量分开存储,通过在对象中插入一个指向这个数组
指针将对象和数组联系起来。这个数组就是虚函数表(vtable)

在这里插入图片描述
左半部分是对象占用的内存,右半部分是虚函数表 vtable。在对象的开头位置有一个指针 vfptr,指向虚函数表,并且这个指针始终位于对象的开头位置。

基类的虚函数在 vtable 中的索引(下标)是固定的,不会随着继承层次的增加而改变,派生类新增的虚函数放在 vtable 的最后。如果派生类有同名的虚函数遮蔽(覆盖)了基类的虚函数,那么将使用派生类的虚函数替换基类的虚函数,这样具有遮蔽关系的虚函数在 vtable 中只会出现一次。

当通过指针调用虚函数时,先根据指针找到 vfptr,再根据 vfptr 找到虚函数的入口地址。

发布了145 篇原创文章 · 获赞 12 · 访问量 9650

猜你喜欢

转载自blog.csdn.net/weixin_44997886/article/details/104614625