C++ 多态的原理
1、多态解决什么问题?
面向抽象编程,用户不需要关心引用或者指针的真实类型,已经内部实现。
2、C++ 要具备多态的性质,满足两个条件:表面类型和真实类型不一样,方法是虚方法。
3、多态是如何实现的?
实现多态就是要解决下面的问题,把子类对象当做父类对象来解释,还要保证调用的是子类的方法。
4、实现原理是:指针(引用)指向对象,对象的内存分布中有一个字段 虚方法表指针,不管是父类对象还是子类对象,这个字段(虚方法表指针)所在的内存位置是一样的,把子类对象当成父类对象来解释,访问的都是这个字段。虚方法表指针指向类的虚方法表,类的虚方法表可以认为是一个数组,包含一组虚方法。子类继承父类,会把父类的虚方法表做一个copy,对于重写的虚方法,替换为自己重写后的方法,对于增加的虚方法添加在虚方法表的后面。
5、考虑Animal* pa = new Dog(); pa->Say(); 会翻译成pa->pFunArray[0](),pFunArray是虚方法表指针,调用类的虚方法表中的第一个方法,由于子类已经替换了,也就是子类的方法了。
6、多态的这种实现存在什么问题?
子类对父类的虚方法表,做一个副本,只替换重写的虚方法,没有重写的虚方法存在两个副本。考虑极端的情况,父类有1000个虚方法,子类只重写了一个虚方法,999个方法都有两个副本,导致内存的浪费,特别是当继承层次深,类的种类多,内存开销就更大,比如视图框架MFC。
7、怎么解决这个问题?
子类只保存重写的虚方法,对于没有重写的虚方法引用父类的虚方法,这就导致一个新问题,相同方法,对于父类和子类,虚方法的位置不一样,这可以使用哈希表解决。
C++ 多态的原理的更多相关文章
- C 语言实现多态的原理:函数指针
C语言实现多态的原理:函数指针 何为函数指针?答案:C Programming Language. 能够查阅下,从原理上来讲,就是一个内存地址.跳过去运行相应的代码段. 既然如此,在运行时决定跳到哪个 ...
- C++ 类的多态三(多态的原理--虚函数指针--子类虚函数指针初始化)
//多态的原理--虚函数指针--子类虚函数指针初始化 #include<iostream> using namespace std; /* 多态的实现原理(有自己猜想部分) 基础知识: 类 ...
- C++基础 (7) 第七天 多态的原理 纯虚函数和抽象类 依赖倒置原则
1 昨日回顾 2 多态的原理 1 要有继承 2 要有子类重写父类的虚函数 3 父类指针(或者引用)指向子类对象 (动态联编 虚函数表 3 证明vptr指针的存在 4 vptr指针在构造父类的时候是分步 ...
- C++多态实现原理详解
C++的多态性用一句话概括就是:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数.如果对象类型是派生类,就调用派生类的函数:如果对象类型是基类 ...
- c++语言虚函数实现多态的原理(更新版)
自上一个帖子之间跳过了一篇总结性的帖子,之后再发,今天主要研究了c++语言当中虚函数对多态的实现,感叹于c++设计者的精妙绝伦 c++中虚函数表的作用主要是实现了多态的机制.首先先解释一下多态的概念, ...
- java多态实现原理
众所周知,多态是面向对象编程语言的重要特性,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定.C++ 和 Java 作为当前最为流行的两种面向对象编程语言,其内部对于多态的支持 ...
- 探索VS中C++多态实现原理
引言 最近把<深度探索c++对象模型>读了几遍,收获甚大.明白了很多以前知其然却不知其所以然的姿势.比如构造函数与拷贝构造函数什么时候被编译器合成,虚函数.实例函数.类函数的区别等等.在此 ...
- C++多态实现原理
C++的多态性用一句话概括就是:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数.如果对象类型是派生类,就调用派生类的函数:如果对象类型是基类 ...
- C++——多态实现原理分析
前言 虚函数执行速度要稍慢一些.为了实现多态性,每一个派生类中均要保存相应虚函数的入口地址表,函数的调用机制也是间接实现.所以多态性总是要付出一定代价,但通用性是一个更高的目标. 实验环境 Windo ...
随机推荐
- netty 支持多种通讯协议
通讯协议,指的是把Netty通讯管道中的二进制流转换为对象.把对象转换成二进制流的过程.转换过程追根究底还是ChannelInboundHandler.ChannelOutboundHandler的实 ...
- Struts2学习笔记——Struts2与Spring整合
Struts2与Spring整合后,可以使用Spring的配置文件applicationContext.xml来描述依赖关系,在Struts2的配置文件struts.xml来使用Spring创建的 ...
- IP视频通信中的"丢包恢复技术”(LPR)
转自:http://blog.csdn.net/blade2001/article/details/9094709 在IP视频通话中,即使是在丢包率很小的情况下也会对使用效果造成较为明显的影响.正是由 ...
- linux dig命令 转
dig 命令主要用来从 DNS 域名服务器查询主机地址信息. 查询单个域名的 DNS 信息 dig 命令最典型的用法就是查询单个主机的信息. $ dig baidu.com dig 命令默认的输出信息 ...
- 罪恶黑名单第一季/全集The Blacklist迅雷下载
罪恶黑名单 第一季 The Blacklist Season 1 (2013)本季看点:几十年来,绰号「红魔」(Red)的前军事情报官员Raymond Reddington(James Spader) ...
- 用代码打开通知中心(statusbar、通知栏、消息中心)
我想用代码来打开android的消息中心,也叫做statusbar.通知栏.通知栏其实就是一个常驻的服务,至于原理这里就不多说了,简单说下思路和问题. 思路:API中没有实现的方法,那么就利用反射机制 ...
- [Android Security] Smali和逆向分析
copy : https://blog.csdn.net/u012573920/article/details/44034397 1.Smali简介 Smali是Dalvik的寄存器语言,它与Java ...
- 【UOJ Round #1】
枚举/DP+排列组合 缩进优化 QAQ我当时一直在想:$min\{ \sum_{i=1}^n (\lfloor\frac{a[i]}{x}\rfloor + a[i] \ mod\ x) \}$ 然而 ...
- 【转】vs2012-vs2010使用stlport库的配置
http://www.cnblogs.com/sbaicl/archive/2012/08/30/2663114.html STLport下载地址:http://sourceforge.net/pro ...
- 访问Oracle数据库的工具【unfinished】
ylbtech-Oracle:访问Oracle数据库的工具 访问Oracle数据库的工具 1. SQL*PLUS返回顶部 1.0, 1.0.1, 之network\admin\tnsnames.ora ...