C++ 多态的原理

2021年09月15日 阅读数:5
这篇文章主要向大家介绍C++ 多态的原理,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

一、多态解决什么问题?
面向抽象编程,用户不须要关心引用或者指针的真实类型,已经内部实现。
二、C++ 要具有多态的性质,知足两个条件:表面类型和真实类型不同,方法是虚方法。
三、多态是如何实现的?
实现多态就是要解决下面的问题,把子类对象当作父类对象来解释,还要保证调用的是子类的方法。
四、实现原理是:指针(引用)指向对象,对象的内存分布中有一个字段 虚方法表指针,无论是父类对象仍是子类对象,这个字段(虚方法表指针)所在的内存位置是同样的,把子类对象当成父类对象来解释,访问的都是这个字段。虚方法表指针指向类的虚方法表,类的虚方法表能够认为是一个数组,包含一组虚方法。子类继承父类,会把父类的虚方法表作一个copy,对于重写的虚方法,替换为本身重写后的方法,对于增长的虚方法添加在虚方法表的后面。
五、考虑Animal* pa = new Dog(); pa->Say(); 会翻译成pa->pFunArray[0](),pFunArray是虚方法表指针,调用类的虚方法表中的第一个方法,因为子类已经替换了,也就是子类的方法了。
六、多态的这种实现存在什么问题?
子类对父类的虚方法表,作一个副本,只替换重写的虚方法,没有重写的虚方法存在两个副本。考虑极端的状况,父类有1000个虚方法,子类只重写了一个虚方法,999个方法都有两个副本,致使内存的浪费,特别是当继承层次深,类的种类多,内存开销就更大,好比视图框架MFC。
七、怎么解决这个问题?
子类只保存重写的虚方法,对于没有重写的虚方法引用父类的虚方法,这就致使一个新问题,相同方法,对于父类和子类,虚方法的位置不同,这可使用哈希表解决。编程