首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ --与对象或类关联的vptr & vtbl?

C++ --与对象或类关联的vptr & vtbl?
EN

Stack Overflow用户
提问于 2011-03-29 12:39:38
回答 2查看 3.9K关注 0票数 6

vptr --虚拟表指针

vtbl --虚拟表

问题1> vptr与类的对象相关联是正确的吗?

问题2>将vtbl与类关联是否正确?

问题3>他们是如何真正协同工作的?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-29 13:26:55

请注意,vptrvtbl是实现定义的,C++标准甚至没有讨论它们。然而,大多数已知的编译器通过vptrvtbl实现动态分派。

问题1: vptr 与类的对象关联是正确的吗?

是的

vptr与包含Atleast one虚拟成员函数的类的对象相关联。编译器将this指针的前4个字节添加到类的每个Polymorphic对象(包含至少一个虚拟成员函数),然后指向vptr

问题2: vtbl 与类关联是正确的吗?

是的

Vtbl与类相关联。为每个Polymorphic类创建一个vtbl

问题3:它们是如何真正协同工作的?

编译器为多态类的每个对象添加一个vptr,并为每个类创建一个vtblvptr指向vtblvtbl包含该类中所有虚函数的地址列表。如果派生类覆盖了基类的虚函数,则vtbl中该特定函数的地址条目将替换为被覆盖函数的地址。在运行时,编译器根据指针内部的地址而不是指针的类型遍历特定类(基类或派生类)的vtbl,并调用vtbl中的函数地址。从而实现了动态多态性

这种动态多态性的代价是:

fetch(获取其中的vptr )fetch(从vtbl中的函数列表获取函数地址)Call(调用函数)

相对于call(自静态绑定以来直接调用函数)。

票数 9
EN

Stack Overflow用户

发布于 2011-03-29 12:46:14

虚拟表指针只是类的每个对象中的一个指针,指向正确的虚拟表。在虚拟表中是类的虚拟函数的地址。当通过基类指针调用函数时,编译器遍历虚拟表以获取正确的函数。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5467956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档