虚函数表是不是存放在一个固定的地方,不管有多少对象,虚函数表都是在哪,虚函数指针去找它的地址,不同对象有不同的虚函数指针,指针的内容指向都一样?
🎯 你的判断逐条确认:
1️⃣ “虚函数表是不是存放在一个固定的地方?”
✅ 是的。
每个带虚函数的类,在程序编译时会生成一张虚函数表(VTable)。
这张表是只读数据(通常在 .rodata 段),在程序启动后存放在固定的内存地址。
不管有多少对象,这张虚表都只生成一份。
2️⃣ “不管有多少对象,虚函数表都是在哪”
✅ 对,只有一张虚函数表,所有对象共享。
比如你有一个类 A,它有虚函数 foo() 和 bar(),那么:
编译器会生成一张表(VTable):[&A::foo, &A::bar]
不管你创建多少个 A 的对象,这张表都只有一份,所有对象共用。
3️⃣ “虚函数指针去找它的地址”
✅ 是的,vptr 是对象中的一个隐藏指针,指向那张虚函数表。
每个对象在其内存布局的最前面,会有一个隐藏的成员变量,叫做 vptr(虚函数指针)。
当你调用一个虚函数时,C++ 编译器会生成类似下面的代码(伪代码):
obj->vptr[3]() // 调用虚表中第3个函数指针
也就是说:
对象自身不存函数指针,它只是通过 vptr 这条“索引路径”去找那张共用的虚函数表。
4️⃣ “不同对象有不同的虚函数指针,指针的内容指向都一样”
✅ 完全正确!
每个对象有自己的 vptr 成员(虽然你代码里看不到,是编译器自动加的)。
但是:对象的 vptr 值是一样的,因为它们都指向同一张虚函数表。
例子:
A a1, a2;
在内存中:
对象 vptr 的值
a1.vptr → 指向 vtable for A 的地址
a2.vptr → 同样指向 vtable for A 的地址
📌 图示理解(可选)
假设类 A 有两个虚函数:
class A {
public:
virtual void foo();
virtual void bar();
};
编译器会生成:
vtable_A:
+0 → &A::foo
+8 → &A::bar
每个对象:
a1:
vptr → vtable_A
a2:
vptr → vtable_A
✅ 总结你的理解是否正确?
你说的内容 是否正确 说明
虚函数表只有一份,存在固定地方 ✅ 每个类一张表,存在 .rodata 段
所有对象共用虚表,只是有不同的 vptr ✅ 每个对象有自己的 vptr 指针
不同对象的 vptr 内容一样,都是指向那张虚表 ✅ 这就是多态的基础
虚函数调用通过 vptr 间接跳转实现 ✅ 即运行时多态(runtime dispatch)
2415

被折叠的 条评论
为什么被折叠?



