关于C++多态的实现手段-虚函数表

本文详细探讨了C++中的虚函数表,揭示了其作为多态实现基础的奥秘。虚函数表是一个包含函数指针的数组,由编译器在程序加载时创建。每个类的虚函数表与其叶子类相关联,子类重写虚函数时会替换父类的指针。在调用虚函数时,通过虚函数表直接找到对应实现,实现了动态绑定和多态性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前几天面试被问到了这个,当时没有回答上来,可能还是没有理解,(之前也看过相关的文章,但写的都过于复杂),今天新自调试了一次,把结果拿出来分享一下

1、虚函数表是什么东西,是如何存在的?是什么时候创建的?

虚函数表实际上就是一个函数指针数组,如果我们定义了n虚函数,那个这个数组个数就是n。

这个指针属于顶级父类,所以多继承,继承了几个父类,就有几个虚函数表

从我调试分析,虚函数表的地址是固定的,也就是说这个东西不是实例创建的时候才生成的,而是程序一运行起来就有的,也就是编译时期确定好的

2、虚函数表是依据什么生成,编译期会生成几个虚函数表?

虚函数表虽然是顶级父类的成员,但它却是跟叶子类绑定的,也就是说有多少个叶子类,编译器就会准备多少个虚函数表。子类的每个虚函数,会沿着父类到子类这条路下来,如果有重写就会将指针替换子类的

3、虚函数表是如何实现多态的?

当调用虚函数的时候,会直接从虚函数表里找对应的函数,而不再根据此指针或引用的类型找对应类的成员函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值