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

C++ 多态的原理的更多相关文章

  1. C 语言实现多态的原理:函数指针

    C语言实现多态的原理:函数指针 何为函数指针?答案:C Programming Language. 能够查阅下,从原理上来讲,就是一个内存地址.跳过去运行相应的代码段. 既然如此,在运行时决定跳到哪个 ...

  2. C++ 类的多态三(多态的原理--虚函数指针--子类虚函数指针初始化)

    //多态的原理--虚函数指针--子类虚函数指针初始化 #include<iostream> using namespace std; /* 多态的实现原理(有自己猜想部分) 基础知识: 类 ...

  3. C++基础 (7) 第七天 多态的原理 纯虚函数和抽象类 依赖倒置原则

    1 昨日回顾 2 多态的原理 1 要有继承 2 要有子类重写父类的虚函数 3 父类指针(或者引用)指向子类对象 (动态联编 虚函数表 3 证明vptr指针的存在 4 vptr指针在构造父类的时候是分步 ...

  4. C++多态实现原理详解

    C++的多态性用一句话概括就是:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数.如果对象类型是派生类,就调用派生类的函数:如果对象类型是基类 ...

  5. c++语言虚函数实现多态的原理(更新版)

    自上一个帖子之间跳过了一篇总结性的帖子,之后再发,今天主要研究了c++语言当中虚函数对多态的实现,感叹于c++设计者的精妙绝伦 c++中虚函数表的作用主要是实现了多态的机制.首先先解释一下多态的概念, ...

  6. java多态实现原理

    众所周知,多态是面向对象编程语言的重要特性,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定.C++ 和 Java 作为当前最为流行的两种面向对象编程语言,其内部对于多态的支持 ...

  7. 探索VS中C++多态实现原理

    引言 最近把<深度探索c++对象模型>读了几遍,收获甚大.明白了很多以前知其然却不知其所以然的姿势.比如构造函数与拷贝构造函数什么时候被编译器合成,虚函数.实例函数.类函数的区别等等.在此 ...

  8. C++多态实现原理

    C++的多态性用一句话概括就是:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数.如果对象类型是派生类,就调用派生类的函数:如果对象类型是基类 ...

  9. C++——多态实现原理分析

    前言 虚函数执行速度要稍慢一些.为了实现多态性,每一个派生类中均要保存相应虚函数的入口地址表,函数的调用机制也是间接实现.所以多态性总是要付出一定代价,但通用性是一个更高的目标. 实验环境 Windo ...

随机推荐

  1. [Winform]通过钩子监控键盘操作和鼠标移动

    摘要 有这样一个需求,在程序隐藏之后,需要监控当前电脑是否有操作,如果1分钟内,无操作,则弹出视频,循环播放. 解决办法 从网上找的一个解决办法,可以通过钩子的方式实现,这里记录一下. /// < ...

  2. 基于设备树的TQ2440的中断(2)

    下面以按键中断为例看看基于设备数的中断的用法: 设备树: tq2440_key { compatible = "tq2440,key"; interrupt-parent = &l ...

  3. java根据模板导出PDF详细教程

    原文:https://blog.csdn.net/pengyufight/article/details/75305128 题记:由于业务的需要,需要根据模板定制pdf文档,经测试根据模板导出word ...

  4. iphone6/6+ 适配心得

    1.     文档综述 自iphone6/6+发布,ios屏幕分辨率的种类一下从2种变成了四种.对于以前很多手写UI,并且使用绝对坐标的UI,可能会发生异变,本文主要介绍在纯手写UI条件下,ios应用 ...

  5. Linux学习16-CentOS安装gitlab环境

    前言 在学习Gitlab的环境搭建之前,首先需要了解Git,Gitlab,GitHub他们三者之间的关系 Git 它是一个源代码版本控制系统,可让您在本地跟踪更改并从远程资源推送或提取更改. GitH ...

  6. 数据更新后让ListView自动滚动到底部

    在做聊天界面的时候想要发送新的数据后,listview自动滚动到底部,显示出最新的数据.网上找了两个方法,觉得不错,记录一下. 方法一: 给listview添加下面两个属性 android:stack ...

  7. 100base-T

    100Base-T是一种以100Mbps速率工作的局域网(LAN)标准,它通常被称为快速以太网标准,并使用两对UTP(非屏蔽双绞线)铜质电缆. 快速以太网 : 与10BASE-T的区别在于网络速率是1 ...

  8. Statistical Artifact (error)

    In natural science and signal processing, an artifact is any error in the perception or representati ...

  9. RFC 868 -- TIME Protocol

    INTERNET STANDARD Errata Exist Network Working Group J. Postel - ISI Request for Comments: 868 K. Ha ...

  10. sqlserver 临时表、表变量、CTE的比较

    原文地址:  sqlserver 临时表.表变量.CTE的比较 1.临时表 1.1 临时表包括:以#开头的局部临时表,以##开头的全局临时表. 1.2 存储 不管是局部临时表,还是全局临时表,都会放存 ...