c++ 多态,继承的代价

本文探讨了在C++中实现多态与继承时编译器面临的挑战,包括虚表访问、函数指针实现及多继承带来的复杂性,并讨论了这些机制如何影响执行效率。

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

首先多态,需要编译器设计额外的代码来在执行期完成多态的支持,其中包括虚表的访问,每次调用比不适用多态要多一次访问虚表,另外它也影响了函数指针的实现,因为对于虚函数,指向类虚函数的指针再也不能只是简单的指向函数的地址,因为这样函数指针就不具备多态的能力,所以一般指向虚函数的指针都是该虚函数在虚表中的偏移量,而指向其它的函数的指针依然是函数在内存中的地址,那么怎么区别这2者呢?要做到真正的区别编译器需要一个结构来保存足够的信息。

再说继承,单体系的继承带来的代价相对较少,对于多继承,简直可以说是一场灾难。理想下,位于同一继承层次的类,应该被放于内存的同一地址层次,但是内存是一个单调的地址。无法将两个以及两个以上的类放在同一起始内存地址。由此带来的问题是,对于非第一继承的基类,需要在调用虚函数时进行this指针的地址调整。由于多继承而引入的虚基类更让这场灾难变得更加悲剧,首先是虚基类是多个类共享的一个结构,它的存放位置着实让编译器头疼,有的通过在虚表中保存虚基类的偏移地址,有的通过指针,有的通过指针表,总得来说要解决的问题有2个:1.每一个对象必须针对其每一个虚基类背负一个额外的指针,然而理想上我们却希望类有固定的负担,不因为其虚基类的数目而有所变化2.由于虚拟继承串链的加长,导致间接存取层次的增加,然而理想上我们却希望有固定的存取时间,不因为虚拟衍化的深度而改变。

看来java等语言取消对多继承的支持,不仅方便了程序员,也更是方便了编译器开发人员。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值