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

最新文章

  1. java中的小数的取整的几种函数
  2. LeetCode#11. Container With Most Water
  3. web基础知识小记
  4. 微软第四题 给定cost能遍历的最大城市数
  5. 带给您灵感的25个最新鲜的 HTML5 网站
  6. 网络模拟器WANem使用配置图文教程
  7. TextGrocery中文文本分类处理
  8. Jni中C++和Java的参数传递 参数对照
  9. cetnos 6.7 安装 oracle 11详解
  10. C++图结构的图结构操作示例
  11. scrollTop,scrollLeft
  12. VC++ try catch (转)
  13. python 在linux下通过top,和dh命令获得cpu,内存,以及硬盘信息
  14. MySQL AUTO_INCREMENT 简介
  15. JavaSE学习总结第01天_Java概述
  16. [译]ASP.NET Core 2.0 视图组件
  17. 基于CDH 5.9.1 搭建 Hive on Spark 及相关配置和调优
  18. YUI 和路径相关的参数与module加载之间的关系
  19. Python系列之 - 锁(GIL,Lock,Rlock,Event,信号量)
  20. 【爬虫综合作业】猫眼电影TOP100分析

热门文章

  1. ElasticSearch入门 :Windows下安装ElasticSearch
  2. [C# 基础知识系列]专题八: 深入理解泛型(二)
  3. DbContextScope,A simple and flexible way to manage your Entity Framework DbContext instances,by mehdime
  4. read(10, "NTP0 13690\n", 64) 数据库登录缓慢
  5. WordPress基础:常用分类列表wp_list_categories
  6. 手机端可以和PC端同时在线-java QRCode 实现网站扫码登录(即支持同帐号多设备同时登录)
  7. 行尸走肉第一季/全集The Walking Dead迅雷下载
  8. 【转】内存分析工具 MAT 的使用
  9. mongodb分布式集群搭建手记
  10. 在Windows7/8/10上,安装IIS