虚函数表是C++实现运行时多态的核心机制,它是编译器自动生成的一种数据结构,用于支持虚函数的动态调用。
虚函数表是什么?
虚函数表(vtable)是:
-
一个函数指针数组,存储类中所有虚函数的地址
-
每个包含虚函数的类都有一个对应的虚函数表
-
每个含有虚函数的对象都有一个隐藏的虚函数表指针(vptr)指向该表
class Base {
public:
virtual void func1() { /*...*/ }
virtual void func2() { /*...*/ }
};
class Derived : public Base {
public:
void func1() override { /*...*/ } // 重写func1
virtual void func3() { /*...*/ } // 新增虚函数
};
编译器会为这两个类生成虚函数表:
Base类的vtable:
[0] Base::func1()的地址 [1] Base::func2()的地址
Derived类的vtable:
[0] Derived::func1()的地址 // 重写的func1 [1] Base::func2()的地址 // 继承的func2 [2] Derived::func3()的地址 // 新增的func3
虚函数表的作用
-
实现动态绑定:通过vptr在运行时找到正确的函数实现
-
支持多态:允许基类指针/引用调用派生类的函数实现
-
管理虚函数调用:解决"调用哪个实现"的问题
虚函数表的工作过程
-
当创建含有虚函数的类对象时,编译器自动在对象中添加一个vptr
-
在构造函数中,vptr被初始化为指向该类的vtable
-
当通过基类指针调用虚函数时:
-
通过对象的vptr找到vtable
-
在vtable中找到函数地址
-
调用该地址指向的函数
-
虚函数表是C++实现面向对象多态性的关键底层机制