C++(虚拟)功能表
C++ (Virtual) Function Table
C++ vtable仅用于确定在调用虚函数时应执行哪一段代码,还是在运行时有其他用途?
在维基百科上,它列出了"动态调度"作为原因,但没有进一步详细介绍C++.....
一些实现将指向 RTTI 代码(typeid
、dynamic_cast
、...)使用的信息的指针放在 vtable 的插槽中(请参阅此处了解 G++ ABI 所基于的 Itanium ABI)。
(实际上,如果您阅读安腾 ABI 规范,它会稍微复杂一些,但这是一般想法)
此外,正如您从链接文档中看到的那样,还有更多的东西可以访问基类的数据,在调用基类方法时执行指针调整,...,主要是"复杂"对象层次结构(多重继承,虚拟基类等)中需要的东西,因为在经典的单继承场景中,派生类的布局很简单,不需要所有这些大惊小怪。
C++ vtable 只是函数指针的查找表。 任何特定的C++实现都可以将 vtable 用于其他事情;但这是特定于实现(和版本)的。 依靠 vtable 来调用虚拟方法以外的任何东西C++是一个非常糟糕的主意。
相关文章:
- 如何在C++中获得"静态纯虚拟"功能?
- std::is_trivially_copyable_v 关于虚拟功能
- 类似虚拟的朋友功能?
- 是否有任何模式等效于虚拟模板功能?
- 隐藏重载虚拟功能的模板化访客:SFINAE 在使用?
- 为什么我无法覆盖虚拟功能?
- 二叉搜索树 - 使用 Linux 在虚拟机中制作删除功能
- 虚拟功能不起作用
- 如果在创建对象时创建了 VPTR,那么为什么具有虚拟功能的类的大小在 32 位系统上为 4,在 64 位机器上为 8
- 虚拟功能如何影响static_cast?
- __declspec(属性)和虚拟功能
- 实现来自第三方类的虚拟功能
- 消除未使用的虚拟功能
- 为什么虚拟继承即使不涉及虚拟功能也需要 vtable?
- C 虚拟功能的输出
- 抽象类 A 由类 C 继承"through"类 B "intermediary"。如何声明虚拟功能?
- 虚拟功能是否不太可能导致堆栈溢出
- 使用继承和虚拟功能应用五个规则
- 父会员功能中虚拟函数的C 行为
- 在多态性中重新定义功能(虚拟),具有不同数量的参数