C++ 多态的原理
2024-10-20 01:07:23
1、多态解决什么问题?
面向抽象编程,用户不需要关心引用或者指针的真实类型,已经内部实现。
2、C++ 要具备多态的性质,满足两个条件:表面类型和真实类型不一样,方法是虚方法。
3、多态是如何实现的?
实现多态就是要解决下面的问题,把子类对象当做父类对象来解释,还要保证调用的是子类的方法。
4、实现原理是:指针(引用)指向对象,对象的内存分布中有一个字段 虚方法表指针,不管是父类对象还是子类对象,这个字段(虚方法表指针)所在的内存位置是一样的,把子类对象当成父类对象来解释,访问的都是这个字段。虚方法表指针指向类的虚方法表,类的虚方法表可以认为是一个数组,包含一组虚方法。子类继承父类,会把父类的虚方法表做一个copy,对于重写的虚方法,替换为自己重写后的方法,对于增加的虚方法添加在虚方法表的后面。
5、考虑Animal* pa = new Dog(); pa->Say(); 会翻译成pa->pFunArray[0](),pFunArray是虚方法表指针,调用类的虚方法表中的第一个方法,由于子类已经替换了,也就是子类的方法了。
6、多态的这种实现存在什么问题?
子类对父类的虚方法表,做一个副本,只替换重写的虚方法,没有重写的虚方法存在两个副本。考虑极端的情况,父类有1000个虚方法,子类只重写了一个虚方法,999个方法都有两个副本,导致内存的浪费,特别是当继承层次深,类的种类多,内存开销就更大,比如视图框架MFC。
7、怎么解决这个问题?
子类只保存重写的虚方法,对于没有重写的虚方法引用父类的虚方法,这就导致一个新问题,相同方法,对于父类和子类,虚方法的位置不一样,这可以使用哈希表解决。
最新文章
- java中的小数的取整的几种函数
- LeetCode#11. Container With Most Water
- web基础知识小记
- 微软第四题 给定cost能遍历的最大城市数
- 带给您灵感的25个最新鲜的 HTML5 网站
- 网络模拟器WANem使用配置图文教程
- TextGrocery中文文本分类处理
- Jni中C++和Java的参数传递 参数对照
- cetnos 6.7 安装 oracle 11详解
- C++图结构的图结构操作示例
- scrollTop,scrollLeft
- VC++ try catch (转)
- python 在linux下通过top,和dh命令获得cpu,内存,以及硬盘信息
- MySQL AUTO_INCREMENT 简介
- JavaSE学习总结第01天_Java概述
- [译]ASP.NET Core 2.0 视图组件
- 基于CDH 5.9.1 搭建 Hive on Spark 及相关配置和调优
- YUI 和路径相关的参数与module加载之间的关系
- Python系列之 - 锁(GIL,Lock,Rlock,Event,信号量)
- 【爬虫综合作业】猫眼电影TOP100分析
热门文章
- ElasticSearch入门 :Windows下安装ElasticSearch
- [C# 基础知识系列]专题八: 深入理解泛型(二)
- DbContextScope,A simple and flexible way to manage your Entity Framework DbContext instances,by mehdime
- read(10, &;quot;NTP0 13690\n&;quot;, 64) 数据库登录缓慢
- WordPress基础:常用分类列表wp_list_categories
- 手机端可以和PC端同时在线-java QRCode 实现网站扫码登录(即支持同帐号多设备同时登录)
- 行尸走肉第一季/全集The Walking Dead迅雷下载
- 【转】内存分析工具 MAT 的使用
- mongodb分布式集群搭建手记
- 在Windows7/8/10上,安装IIS