虚函数及虚函数表

虚函数表是不是存放在一个固定的地方,不管有多少对象,虚函数表都是在哪,虚函数指针去找它的地址,不同对象有不同的虚函数指针,指针的内容指向都一样?

🎯 你的判断逐条确认:
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)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值