一、虚函数表(vtable)
1. 定义
- 虚函数表(vtable)是编译器为每个包含虚函数的类生成的一张表,本质上是一个数组,存储着该类所有虚函数的函数指针。
- 虚表中存储了该类所有虚函数的地址,如果派生类重写了基类的虚函数,则派生类虚表中会替换为自身重写的函数地址;未重写的虚函数地址则继承自基类。
2. 特点
- 每个含虚函数的 类 都会有一张虚表。
- 继承关系:
- 派生类会继承基类的虚表,但会根据自身重写的虚函数修改对应条目。
- 如果派生类新增了虚函数,这些函数地址会被添加到虚表的末尾。
- 虚表在 编译期确定,但调用时选择哪个表由对象的运行时类型决定。
- 虚表通常存储在只读段(.rodata)中,不随对象复制而重复。
3. 示例
#include <iostream>
using namespace std;
class Base {
public:
virtual void f1() { cout << "Base::f1\n"; }
virtual void f2() { cout << "Base::f2\n"; }
void f3() { cout << "Base::f3\n"; }
};
class Derived : public Base {
public:
void f1() override
{ cout << "Derived::f1\n"; }
void f2() override
{ cout << ; }
{ cout << ; }
};