虚拟表的说明
Explanation of virtual table
可能的重复:
了解VTable条目
使用G 版本4.6.3,64位机器。我知道编译器可以自由地实现其所需的虚拟功能。我想知道这里发生了什么。
我的班级:
#include <iostream>
class test
{
public:
virtual void func(){std::cout<<"in class test";}
};
int main()
{
test obj;
obj.func();
return 0;
}
查看编译器生成的虚拟表,
Vtable for test
test::_ZTV4test: 3u entries
0 (int (*)(...))0 (<---- what is this? )
8 (int (*)(...))(& _ZTI4test)
16 (int (*)(...))test::func
在偏移8时,它是rtti
在偏移16时,它是虚拟函数的输入。
我的问题是,为什么在偏移0或换句话说,第一次输入的目的是什么?
P.S。我认为这可能与对齐有关,但是后来我添加了更多虚拟功能,但是RTTI条目仍处于Offset 8。
我相信第一个条目或在0处的条目是顶指针的偏移。
请参阅以下相关的stackoverflow问题
从源代码中查看剩余的-fdump-class层次结构,大多数类似乎都有第一个条目为(int (*)(...))0
,这是唯一没有它的类,因为第一个条目将其作为第二个条目,并具有首先输入作为对流的C STL类层次结构的偏移。
在相关的问题中,给出了一些与某些VTable示例的链接,我相信该链接的实时版本
可用另一个有用的资源详细介绍了Vtables的结构。
相关文章:
- 虚拟决赛作为安全
- PowerPC ppc64le上的Gcc Woverloaded虚拟错误
- 如何在C++中获得"静态纯虚拟"功能?
- C++无法定义虚拟函数 OUTER 类和头文件
- 当使用通配符和null指针调用函数时,对输出的说明
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 尝试将unique_ptrs推送到向量时使用纯虚拟函数错误
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 关于C++中具有多重继承"this"指针的说明
- 大小虚拟继承中的派生类
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- 使用 C++ 和 i2c 工具从虚拟 i2c 写入和读取
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- 如果整个应用程序是虚拟映射的,为什么 new 会进行系统调用?
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- std::is_trivially_copyable_v 关于虚拟功能
- 删除C++继承中虚拟类成员的代码重复
- 虚拟表的说明
- 说明如何通过基类创建派生类的对象(虚拟析构函数概念)