为什么我们需要虚拟表?

2024-01-06

我正在寻找一些有关虚拟表的信息,但找不到任何易于理解的内容。

有人能给我一些很好的例子和解释吗?


如果没有虚拟表,您将无法使运行时多态性发挥作用,因为对函数的所有引用都将在编译时绑定。一个简单的例子

struct Base {
  virtual void f() { }
};

struct Derived : public Base {
  virtual void f() { }
};

void callF( Base *o ) {
  o->f();
}

int main() {
  Derived d;
  callF( &d );
}

函数内部callF,你只知道o指向一个Base目的。但是,在运行时,代码应该调用Derived::f (since Base::f是虚拟的)。在编译时,编译器无法知道将要执行哪些代码o->f()打电话,因为它不知道什么o指着。

因此,您需要一个称为“虚拟表”的东西,它基本上是一个函数指针表。每个具有虚函数的对象都有一个“v表指针”,指向其类型的对象的虚表。

中的代码callF上面的函数只需要查找条目Base::f在虚拟表中(它根据对象中的虚拟表指针找到虚拟表),然后调用表项指向的函数。那might be Base::f但也有可能它指向别的东西——Derived::f, 例如。

这意味着由于虚拟表,您可以在运行时具有多态性,因为被调用的实际函数是在运行时通过在虚拟表中查找函数指针然后通过该指针调用该函数来确定的,而不是调用直接调用该函数(与非虚函数的情况一样)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我们需要虚拟表? 的相关文章

随机推荐

  • 四舍五入双精度值,同时保留尾随零

    这是我的函数 将数字四舍五入到小数点后两位 但是当四舍五入的数字为 1 50 时 它似乎忽略尾随零并只返回 1 5 public static double roundOff double number double accuracy 20
  • Python re.sub:忽略替换字符串中的反向引用

    我想用字符串替换模式 该字符串在变量中给出 当然 它可能包含 1 并且不应将其解释为反向引用 而应简单地解释为 1 我怎样才能做到这一点 之前的答案使用re escape 会转义太多 并且您会在替换和替换字符串中得到不需要的反斜杠 似乎在
  • 如何限制用户在输入元素中输入10位数字?

    我想为电话号码创建一个输入字段 我正在使用 JavaScript 动态创建输入字段
  • 带对齐的字符串格式货币

    print this is 0 gt 10 2f format 3 44 打印出 this is 3 44 即分开 从金额 有没有办法在金额旁边的正确位置打印带有货币符号的间隔列 例如 this is 3 44 I tried print
  • MongoDB:使用 2 个嵌套数组更新文档中的平均值

    我有以下 MongoDB 文档 id ObjectId company name Name registered 2 21 2015 2 00 trucks truck id TEB7622 weight 88 33 capacity 27
  • CamelCase JSON WebAPI 子对象(嵌套对象、子对象)

    我正在创建一个复杂的对象 其中包含要从我的 Web api 控制器返回的子对象 嵌套对象 该对象包含其他对象类型的列表 列表中的这些子对象类型遵循 NET 中使用的 pascal 大小写 var persons peopleLookup V
  • 如何最好地将模糊的 ProgressBar 放置在屏幕上的 ConstraintLayout 上?

    当我单击 登录 按钮时 会显示一个进度条 我通过在顶部添加一个工具栏对布局进行了修改 似乎该工具栏现在遮盖了进度栏 如何使该进度条在屏幕中央的某个位置可见 非常感谢您的帮助 布局xml代码如下所示 活动登录 xml
  • Chrome、Safari 和 Firefox 中内联块元素之间的幽灵空间 [重复]

    这个问题在这里已经有答案了 如何删除内联块元素之间的幽灵空间 这是一个jsfiddlehttp jsfiddle net hFDcV http jsfiddle net hFDcV 您可以清楚地看到 div 之间的水平空间 StackOve
  • 忽略实体框架中的特定列? [复制]

    这个问题在这里已经有答案了 我从实体框架版本 4 1 10331 0 中的数据库自动生成了模型 我想忽略实体中的列 而不使用 Fluent Api 且不更改ObjectContext into DbContext 当然 不会从 SQL 表中
  • 使用 pdfmake 在段落周围添加边框

    我正在通过生成pdfpdfmake http bpampuch github io pdfmake 假设我有这样的 pdf 内容 var docDefinition content Lorem ipsum dolor sit amet co
  • Python 中的字符串是池化的吗?

    Python 是否有一个所有字符串的池 并且它们 字符串 是单例吗 更准确地说 在下面的代码中 是在内存中创建了一个还是两个字符串 a str num b str num 字符串在 Python 中是不可变的 因此实现可以决定是否实习 这是
  • heroku 上的 Hapi 服务器无法绑定端口

    我正在为 ReactJS 应用程序开发 Hapi 服务器 但当我尝试部署到 Heroku 时 收到 R10 错误 无法在启动后 60 秒内绑定到 PORT 到底是怎么回事 我正在使用 process env PORT 我也尝试过 parse
  • Web 应用程序安全的好指南? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我非常擅长制作网络应用程序 并且知道如何在客户端 服务器等之间传输数据 尽管学习如何使数据交换更安全 但我需要一些帮助 这就是为什么我有点害怕发
  • 如何在 C++ 中存储变量数据

    我正在创建一个存储有关特定数据源的元数据的类 元数据采用树状结构 与 XML 的结构非常相似 元数据值可以是整数 小数或字符串值 我很好奇 C 中是否有一种好方法来存储这种情况的变体数据 我希望变体使用标准库 因此我避免使用可用的 COM
  • Numba:如何抑制

    我的 numba 代码中不断出现此错误 Warning 101 0 Unused argument self 我的 numba 代码如下 如何抑制错误消息 autojit def initialise output data self in
  • 使用 $switch 将分数添加到 MongoDB 聚合

    我正在尝试根据哪个值向我的 mongodb 聚合添加一个分数name字段匹配 例如 如果name与 sitt 完全匹配 得分为100 如果name匹配 sitt i 得分为 50 这是我的代码 db getCollection tags a
  • 构造函数参数的求值顺序[重复]

    这个问题在这里已经有答案了 假设我有这门课 struct A A int int int 我这样初始化它 A a b c 功能在哪里a b and c 全部返回int 应该a 之前被调用b and b before c 我对标准中的以下段落
  • Three.js - 获取鼠标单击的 X、Y 和 Z 坐标

    我在用着版本68三个 js 我想单击某处并获取 X Y 和 Z 坐标 我按照此处的步骤操作 但它们给我的 Z 值为 0 鼠标 画布 X Y 到 Three js 世界 X Y Z https stackoverflow com questi
  • tweepy OAuthHandler 错误

    我是新来的 对 python 没有经验 如果问题很微不足道 很抱歉 我有这个简单的脚本 用于获取给定 Twitter 用户的关注者 import time import tweepy consumer key xxx consumer se
  • 为什么我们需要虚拟表?

    我正在寻找一些有关虚拟表的信息 但找不到任何易于理解的内容 有人能给我一些很好的例子和解释吗 如果没有虚拟表 您将无法使运行时多态性发挥作用 因为对函数的所有引用都将在编译时绑定 一个简单的例子 struct Base virtual vo