您的位置:首页 > 编程语言 > C语言/C++

c++ 多态,继承的代价

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

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

看来java等语言取消对多继承的支持,不仅方便了程序员,也更是方便了编译器开发人员。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: