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

虚函数表(VTable)是C++实现运行时多态的核心机制,它让基类指针或引用能调用派生类的重写函数——不是靠编译期决定,而是靠对象内存中隐藏的函数地址跳转来完成。
每个含虚函数的类都有一个VTable
编译器为每个定义了虚函数(或继承了虚函数)的类生成一张静态的函数指针表。这张表里按声明顺序存放着该类所有虚函数的实际地址(即最终要执行的函数入口)。比如:
-
Base 类有
virtual void foo()和virtual void bar(),它的 VTable 就有两个指针,分别指向 Base::foo 和 Base::bar 的代码段; -
Derived 继承 Base 并重写了
foo(),那么 Derived 的 VTable 中第一个指针就换成 Derived::foo 的地址,第二个仍为 Base::bar(除非也被重写); - 如果 Derived 新增了虚函数
virtual void baz(),这个函数地址会追加到 VTable 末尾。
每个对象头部隐式存储一个vptr(虚函数表指针)
只要类有虚函数,编译器就会在该类的每个对象最开始的位置(通常是前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++免费学习笔记(深入)”;
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~