文章目录
- 1 . 前言
- 2 . 多态
- 3 . 向下转型
- 3.1 子类没有改进父类的方法下,去调用该方法
- 3.2 子类有改进父类的方法下,去调用该方法
- 3.3 子类没有改进父类虚函数的方法下,去调用改方法
- 3.4 子类有改进父类虚函数的方法下,去调用改方法
- 3.5 子类调用父类没有的方法,去调用该方法
- 3.6 子类的方法是虚函数,调用该方法
- 4 . 总结
【极客技术传送门】 : https://blog.csdn.net/Engineer_LU/article/details/135149485
1 . 前言
- 此篇博文详解C++的多态向下转型
- 平台 : Qt
2 . 多态
【Q】什么是多态?
【A】解释如下 :
- 通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。在编程语言和类型论中,多态指为不同数据类型的实体提供统一的接口。多态类型可以将自身所支持的操作套用到其它类型的值上。
- 向上转型提到父亲可以使用儿子的能力,那儿子想使用父亲的能力呢?这时候儿子就不要创新功法,否则就用不到父亲的传承了,如果儿子改进了功法,那就用不到对应父亲的功法了,这就是向下转型,父亲的功法重新传给儿子。
3 . 向下转型
【Q】什么是向下转型?
【A】之前向上转型讲述儿子把混沌体的真血移植给父亲,父亲阴差阳错下可以用儿子独有的能力,但在某一天,儿子遇到了问题,需要用到父亲的能力,那怎么办,此时父亲就要把真血重新移植给儿子,儿子就可以调用父亲的能力了
接下来列举几种向下转型后的情况
- 子类没有改进父类的方法下,去调用该方法
- 子类有改进了父类的方法下,去调用该方法
- 子类没有改进父类虚函数的方法下,去调用该方法
- 子类有改进父类虚函数的方法下,去调用该方法
- 子类调用父类没有的方法,去调用该方法
- 子类的方法是虚函数,调用该方法
3.1 子类没有改进父类的方法下,去调用该方法
这时候可以看到,子类直接调用到了父类的能力。
3.2 子类有改进父类的方法下,去调用该方法
这时候可以看到,子类直接调用的是自身的能力。
3.3 子类没有改进父类虚函数的方法下,去调用改方法
这时候可以看到,子类直接调用到了父类的能力。
3.4 子类有改进父类虚函数的方法下,去调用改方法
这时候可以看到,子类直接调用的是自身的能力,也就是说无论父类的能力到底是不是虚函数,对于向下转型来说都一样的。
3.5 子类调用父类没有的方法,去调用该方法
这时候可以看到,子类有自己的方法,即使向下转型后,仍然可以调用自己的方法
3.6 子类的方法是虚函数,调用该方法
这时候看到,打印窗口异常了,阻塞住了,说明内存异常了,为什么会这样,因为向下转型前没有进行向上转型,因此不安全,找不到具体内存,那么接下来展示一个正确的向下转型过程。
> 这里46行加了 向上转型,这样向下转型后,父类就不担心与子类不一样了,因此转换安全。
4 . 总结
-
子类没有改进父类的方法下,去调用该方法
子类直接调用到了父类的能力 -
子类有改进了父类的方法下,去调用该方法
子类直接调用的是自身的能力 -
子类没有改进父类虚函数的方法下,去调用该方法
子类直接调用到了父类的能力 -
子类有改进父类虚函数的方法下,去调用该方法
子类直接调用的是自身的能力,也就是说无论父类的能力到底是不是虚函数,对于向下转型来说都一样的 -
子类调用父类没有的方法,去调用该方法
子类有自己的方法,即使向下转型后,仍然可以调用自己的方法 -
子类的方法是虚函数,调用该方法
如果没有进行向上转型,内存异常,因此如果向下转型,务必先向上转型
向下转型后,子类优先用子类自身有的方法,如果没有则用父类的方法,并且可以访问到父类的私有成员
重点 : 如果向下转型,务必先向上转型
技术交流QQ群 : 745662457
群内专注 - 问题答疑,项目外包,技术研究