C++中多态实现的分析

在我们的学习过程中学习到多态,大概只有这么一句:C++中的多态性是通过虚函数(virtual function)和虚函数表(vtable)来实现的。多态性允许在基类类型的指针 或引⽤上调⽤派⽣类对象的函数,以便在运⾏时选择正确的函数实现。

直接背的话当然没问题,就当八股文了。但是,为什么可以这么做呢?我相信很多人也有这个困惑,现在我就按我自己的理解来解释下上述话。

首先需要明确,类的对象创建时,其内存空间不只会保存类中的成员变量等,还会保存一个非常重要的指针---虚函数表指针。

虚函数表指针保存的时虚函数数组的首地址,而虚函数表中保存的是虚函数的函数地址,这些函数地址可以保证程序运行中动态选择不同的函数执行。

当要实现多态时,那就意味着有派生类,并且派生需要改写基类的虚函数。那么派生类的对象创建时也会拥有属于它的虚函数表和虚函数表指针。此时我们需要知道,派生类是继承于基类的,那么基类的虚函数同样也会出现在派生类中,如果派生类改写了基类的虚函数那么就会覆盖基类的虚函数指针。此时派生类的虚函数表中就会包含继承于基类的虚函数指针,重写了基类的虚函数的虚函数指针,以及派生类自己定义的虚函数的函数指针。并且,这个虚函数表的虚函数表指针同样会放在派生类对象最开始的内存位置。

这个时候再来理解为什么基类指针可以调用派生类的方法。我们都知道派生类是基类的衍生,派生类的对象的内存存储也是先存储基类再然后派生类。

两者内存结构存在很大的相似性,根据切片操作,我们使用基类去操作派生类时,我们只能在有限的内存范围内操作,即包含虚函数指针和基类对象空间那部分内存。但这也完全够了!!!因为内存的第一片区域保存的就是派生类的虚函数表指针,这也就解释通了为什么可以通过基类指针来调用派生类的虚函数了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值