4.CPP虚函数表作用
4.1 题目
C++中虚函数表的作用是什么?
4.2 深入解析
虚函数表(vtable)是 C++ 实现运行时多态的核心机制。编译器在编译阶段为每个定义了虚函数的类生成一张虚函数表,通常存放在只读数据段中,表中存储该类各虚函数在内存中的地址(函数指针)。每个包含虚函数的类实例对象内部都会有一个隐藏的指针(vptr),它在对象创建时被初始化为指向对应类的 vtable。
当通过基类指针或引用调用虚函数时,运行时并不是直接跳转到一个静态地址,而是:
- 通过对象中的 vptr 找到该对象的 vtable;
- 在 vtable 中根据虚函数的偏移位置取出函数指针;
- 调用该指针指向的函数,这就是动态绑定(dynamic dispatch)。
要点:
- 只有声明了至少一个虚函数的类才会生成 vtable;
- 每个对象实例携带一个 vptr,增加了对象大小(一个指针的开销);
- 派生类会继承并可以覆盖基类的 vtable 条目,实现多态行为。
4.3 答题示例
“虚函数表(vtable)是 C++ 实现运行时多态的底层机制。编译器为每个含虚函数的类生成一张函数指针数组(vtable),每个对象实例内部隐藏一个 vptr 指向它的 vtable。调用虚函数时,程序通过 vptr 查表获取实际的函数地址并跳转执行,从而实现基于对象实际类型的动态绑定。需要注意的是,只有定义了虚函数的类才有 vtable,对象尺寸会额外包含一个指针。”
4.4 关键词联想
- 多态(Polymorphism)
- 动态绑定(Dynamic Dispatch)
- vtable / vptr
- 运行时类型识别(RTTI)
- 函数指针数组
- 对象布局
- 覆盖(Override) vs 重载(Overload)
- 虚继承(Virtual Inheritance)
- 性能开销(内存和间接调用成本)
- 类内存模型(Object Memory Model)
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com