vptr 是 C++ 编译器为含虚函数的对象自动插入的隐藏指针,位于对象内存布局起始处,大小与平台指针宽度一致(32 位为 4 字节,64 位为 8 字节),指向所属类的虚函数表(vtable);它在构造函数执行前由编译器初始化,单继承下每个对象一个且恒在开头,多重继承时可能有多个。
vptr 是 C++ 编译器为每个含有虚函数的对象自动插入的一个隐藏指针,全称是 virtual function table pointer(虚函数表指针)。它不显式出现在类定义中,但真实存在于对象内存布局的最前端,指向该对象所属类的虚函数表(vtable)。
在绝大多数主流编译器(如 MSVC、GCC、Clang)中:
sizeof 验证——例如一个仅含一个 int 和一个虚函数的类,在 64 位 Linux 下对象大小通常为 16 字节(8 字节 vptr + 4 字节 int + 4 字节对齐填充)。当通过基类指针或引用调用虚函数时,实际执行流程依赖 vptr:
call [rax] 类汇编指令)执行目标函数。这个过程完全在运行时完成,与变量声明类型无关,只取决于对象实际类型。
注意区分两个概念:
.rodata),所有该类对象共享同一张表;多重继承时可能有多个 vptr(如虚继承或菱形继承场景),但单继承下始终只有一个,且恒在对象开头。
vptr 在对象构造过程中由编译器自动设置: