c++中的VTable(虚函数表)是如何工作的_c++多态实现机制【底层】

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

c++中的VTable(虚函数表)是如何工作的_c++多态实现机制【底层】-第1张图片-佛山资讯网

虚函数表(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++免费学习笔记(深入)”;

标签: 字节 c++ 为什么

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~