C++ 多态的原理

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

时间: 2024-12-28 17:14:43

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

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

C语言实现多态的原理:函数指针 何为函数指针?答案:C Programming Language. 可以查阅下,从原理上来讲,就是一个内存地址,跳过去执行对应的代码段. 既然如此,在运行时决定跳到哪个地方去执行特定的代码即可. 一个简单的版本: 以音频解码器作为例子:AAC 解码器,Mpeg解码器,以及其他类型的解码器. 那手动的多态可能会这样实现: U32 audioHandle = AudioDecOpen(int type) { if(type == aac) return aac_ope

java多态实现原理

众所周知,多态是面向对象编程语言的重要特性,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定.C++ 和 Java 作为当前最为流行的两种面向对象编程语言,其内部对于多态的支持到底是如何实现的呢,本文对此做了全面的介绍. 注意到在本文中,指针和引用会互换使用,它们仅是一个抽象概念,表示和另一个对象的连接关系,无须在意其具体的实现. Java 的实现方式 Java 对于方法调用动态绑定的实现主要依赖于方法表,但通过类引用调用和接口引用调用的实现则有所不同.总体而言,当某个方

接口实现多态的原理

接口中的方法都是什么样子的呢? public interface ImageSave { //接口中的方法可以有返回值类型 //接口里的方法中可以有参数 String getName(); //String getType(String Type); void save(); //void saveDouble(String Type,long kb); } public class GIFSaver implements ImageSave{ @Override public String g

52)多态的原理(过程)

我要是用  子类 调用一个函数    先看虚函数表  有没有这个 函数  要是  没有  再去看  父类的非虚函数有没有匹配的    没有  再去看子类的非虚函数   要是 没有就报错. 父类必写  virtual  但是  子类没必要写 子类写virtual  父类没有   这个函数不是虚函数 原文地址:https://www.cnblogs.com/xiaoyoucai/p/8277448.html

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

前言 虚函数执行速度要稍慢一些.为了实现多态性,每一个派生类中均要保存相应虚函数的入口地址表,函数的调用机制也是间接实现.所以多态性总是要付出一定代价,但通用性是一个更高的目标. 实验环境 Windows10 企业版 Visual Studio2017 15.8.1 #include<iostream> using namespace std; class Base { public: Base() { cout << "Create Base" <<

从虚拟机指令执行的角度分析JAVA中多态的实现原理

从虚拟机指令执行的角度分析JAVA中多态的实现原理 前几天突然被一个"家伙"问了几个问题,其中一个是:JAVA中的多态的实现原理是什么? 我一想,这肯定不是从语法的角度来阐释多态吧,隐隐约约地记得是与Class文件格式中的方法表有关,但是不知道虚拟机在执行的时候,是如何选择正确的方法来执行的了.so,趁着周末,把压箱底的<深入理解Java虚拟机>拿出来,重新看了下第6.7.8章中的内容,梳理一下:从我们用开发工具(Intellij 或者Eclipse)写的 .java 源程

深入理解面向对象三大特性——多态

多态,字面意思,就是多种形态 比如:一种红酒,由不同的人来品尝,会有不同的感觉,这叫做多态: 一个人用不同的方式来喝酒,也会有不同的后果,这也叫做多态. 多态的原理:类都写好了,不要去修改它,只是在类外调用时更改参数,从而实现不同的结果(多态) //举例:创建一个电脑的接口 interface Computer { public function version(); public function work(); } //创建一个笔记本的子类实现接口 class Notecomputer im

php多态简单示例

<?php //多态由不同的人执行而产生不同的结果: //一个人通过不同的状态执行同一种动作,产生不同的结果也可称为多态 //多态的原理,就是类都写好了,不要去修改它,只要在类外的的调用参数的更改 //借口规范了子类的动作 interface Computer{ public function version();//这个方法表示采用什么方法 public function work(); //怎么运行的 } //实现借口,一个笔记本类一个台式机类 class NoteComputer impl

黑马程序员-----多态的概念和条件

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ----- 第一讲  多态的介绍 本小节知识点: 1.[了解]什么是多态? 2.[掌握]多态的条件 3.[了解]多态的优点 提出一个问题: 大家来根据现在学习的知识,思考一个问题:父类能否访问子类方法? 1.什么是多态? 什么是多态:多态就是某一类事物的