【最全】C++面试题 虚函数(第二篇)

1.虚函数的底层原理

虚函数的底层原理主要涉及虚函数表(Virtual Table,简称V-Table)和虚函数指针(vptr)的概念。以下是虚函数底层原理的详细解释:

  1. 虚函数表(V-Table)

    • 虚函数表是一个类的虚函数的地址表,用于索引类本身以及父类的虚函数的地址。

    • 每一个含有虚函数的类(无论是其本身的,还是继承而来的)都至少有一个与之对应的虚函数表。

    • 虚函数表中存放着该类所有的虚函数对应的函数指针。子类对象的虚函数表中既包含继承自基类的虚函数指针,也包含子类新增或重写的虚函数指针。

    • 在多重继承的情况下,子类对象中将包含多个虚函数表的指针,分别指向对应不同基类的虚函数表。

  2. 虚函数指针(vptr)

    • 为了让每个包含虚表的类的对象都拥有一个虚表指针,编译器在类中添加了一个私有指针(通常命名为__vptr),用来指向虚表。

    • 当类的对象在创建时,这个指针的值会自动被设置为指向类的虚表。

    • 只有拥有虚函数的类才会拥有虚函数指针,所以拥有虚函数的类的所有对象都会因为虚函数产生额外的开销。

  3. 虚函数调用过程

    • 当通过父类指针或引用来调用虚函数时,程序会首先查找该对象的虚函数指针(vptr)。

    • 然后通过虚函数指针找到对应的虚函数表(V-Table)。

    • 在虚函数表中,根据函数的偏移量找到对应的函数指针。

    • 最后,通过这个函数指针来调用实际的函数。

  4. 动态联编

    • 虚函数的调用是通过动态联编实现的。与普通函数的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱编程的小猴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值