1. 虚函数表与动态多态的核心原理
在面向对象编程中,虚函数是实现运行时多态的关键机制。当基类声明虚函数时,编译器会为该类生成一个虚函数表(vtable),其中存储了指向实际函数实现的指针。每个包含虚函数的类对象内部会隐式包含一个指向对应vtable的指针(vptr)。
cpp复制class Base {
public:
virtual void func1() { cout << "Base::func1" << endl; }
virtual void func2() { cout << "Base::func2" << endl; }
int base_data;
};
class Derived : public Base {
public:
void func1() override { cout << "Derived::func1" << endl; }
virtual void func3() { cout << "Derived::func3" << endl; }
int derived_data;
};
对于上述代码,Base类的vtable包含两个条目(func1和func2),而Derived类的vtable包含三个条目(覆盖的func1、继承的func2和新增的func3)。当通过基类指针调用虚函数时,实际调用的是vptr指向的vtable中对应的函数实现。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 虚函数表的内存布局分析
在典型实现中,vptr通常位于对象内存布局的首部。以32位系统为例:
code复制Base对象内存布局:
+----------------+
| vptr | -> 指向Base::vtable
+----------------+
| base_data |
+----------------+
Derived对象内存布局:
+----------------+
| vptr | -> 指向Derived::vtable
+----------------+
| base_data |
+----------------+
| derived_data |
+----------------+
