贝利信息

C++中的虚函数表(vtable)是如何工作的?(多态原理)

日期:2026-01-05 00:00 / 作者:尼克
虚函数表(vtable)是C++运行时多态的核心机制,编译器为含虚函数的类生成函数指针表,对象通过vptr访问;构造时vptr动态更新,虚函数调用经vptr→vtable→函数地址三级跳转;静态/内联/友元/构造函数不入vtable,虚析构函数必须存在,模板函数不可为虚。

虚函数表(vtable)是C++实现运行时多态的核心机制。当一个类声明了虚函数,编译器会为该类生成一张函数指针表,每个对象在内存布局的最前面隐式存放一个指向该表的指针(vptr)。调用虚函数时,程序通过对象的vptr找到对应vtable,再根据函数在表中的偏移量跳转到实际地址——这使得基类指针或引用能调用派生类重写的函数。

vtable的生成与结构

编译器在编译期为每个含虚函数的类单独生成一张vtable,表中按虚函数声明顺序依次存放函数指针:

vptr的初始化时机

每个对象构造时,其vptr被自动设置为所属类的vtable地址:

虚函数调用的底层过程

形如 ptr->func() 的调用,在汇编层面展开为三步:

常见误区与限制

vtable机制带来灵活性,但也存在明确边界: