虚函数表(VTable)是C++实现运行时多态的核心机制,每个含虚函数的类有静态函数指针表,按声明顺序存虚函数地址;每个对象头部隐式存储vptr指向所属类VTable;虚函数调用编译为“读vptr→查表→跳转”,支持单/多重/虚继承下的动态绑定。

虚函数表(VTable)是C++实现运行时多态的核心机制,它让基类指针或引用能调用派生类的重写函数——不是靠编译期决定,而是靠对象内存中隐藏的函数地址跳转来完成。
编译器为每个定义了虚函数(或继承了虚函数)的类生成一张静态的函数指针表。这张表里按声明顺序存放着该类所有虚函数的实际地址(即最终要执行的函数入口)。比如:
virtual void foo() 和 virtual void bar(),它的 VTable 就有两个指针,分别指向 Base::foo 和 Base::bar 的代码段;foo(),那么 Derived 的 VTable 中第一个指针就换成 Derived::foo 的地址,第二个仍为 Base::bar(除非也被重写);virtual void baz(),这个函数地址会追加到 VTable 末尾。只要类有虚函数,编译器就会在该类的每个对象最开始的位置(通常是前8字节,在64位系统上)插入一个指针 vptr,它指向所属类的 VTable。这个过程对程序员完全透明:
Base b; → b 的内存开头是 &Base::vtable;Derived d; → d 的内存开头是 &Derived::vtable;Base* p = new Derived; 时,p 指向的是 d 的起始地址,所以 p->vptr 实际指向的是 Derived 的 VTable。像 p->foo(); 这样的调用,编译后不是直接 call 地址,而是三步操作:
立即学习“C++免费学习笔记(深入)”;
这就是为什么虚函数调用比普通函数慢一点:多了一次内存读取和一次间接跳转。但现代CPU分支预测和缓存通常能缓解这部分开销。
单继承下一般只有一个 vptr;但多重继承时,派生类对象可能包含多个子对象布局,每个“基类子对象”区域都可能有自己的 vptr:
class D : public A, public B → D 对象内存中可能有 A 部分的 vptr 和 B 部分的 vptr;基本上就这些。VTable 是静态的、类级别的;vptr 是动态的、对象级别的。两者配合,让 C++ 在零运行时反射的前提下,实现了高效的动态绑定。不复杂但容易忽略——它藏在对象内存布局最前面,默默支撑着 every virtual call。
以上就是c++++中的VTable(虚函数表)是如何工作的_c++多态实现机制【底层】的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号