1、什么是多态?

  父类指针指向子类对象,运行时期调用方法的时候,根据方法拥有者的真实类型,确定调用哪个方法。

2、如何实现多态?

  要实现多态,需要加一个中间层,暴露父类的方法,内部根据指针的真实类型决议方法。

  C++多态的实现方法是:每个类对应一个虚方法表vtbl,子类把父类的虚方法整体拷贝一份,对于重写的虚方法进行置换,换成重写后的方法。每个类对象内有一个vptr指向本类的虚方法表,无论父类对象还是子类对象,vptr都在相同位置。也就是说,即使编译器把子类对象当成父类对象来解释,也是没有问题的,在同样位置可以找到vptr,然后调用相应的方法。

3、显而易见,C++实现多态,要求每个类都有一张虚方法表,子类虚方法表与父类虚方法表的关系是:要么继承,要么重写,要么新增。通过父类指针不能访问新增的虚方法。这种方式的优点是:因为每个虚方法的位置都定下来了,直接可以定位找到对应方法,速度快。缺点是:对于继承的虚方法(实际上是虚方法指针)要重复存储,浪费空间。考虑一种极端的情况:一个父类有100个方法,子类重写一个方法,在子类的虚方法表中只有一个重写,其他都是继承,如果继承层次结构繁多,就会大量浪费内存。

4、有没有更好的办法呢?

  最容易想到的是:子类的方法表中只保留重写的方法,对于继承的方法不再存储,而是引用父类的方法。但是,这有一个问题,那就是方法的位置不确定了,必须遍历才能找到方法,时间效率低。时间效率低,可以使用哈希表来解决,直接定位方法的位置。

  还有一种办法是:不使用虚方法。在类中保留一个方法指针,方法形参是该类的对象。对于不同的对象赋值给不同的方法。

C++多态的实现与局限性的更多相关文章

  1. 黑马程序员——JAVA基础之多态与Object

    ------- android培训.java培训.期待与您交流! ----------  多态 : 多态定义:  某一类事物的多种存在形态. 多态的体现: 父类的引用指向了自己的子类对象.       ...

  2. C++值多态:传统多态与类型擦除之间

    引言 我有一个显示屏模块: 模块上有一个128*64的单色显示屏,一个单片机(B)控制它显示的内容.单片机的I²C总线通过四边上的排针排母连接到其他单片机(A)上,A给B发送指令,B绘图. B可以向屏 ...

  3. java面向对象(封装-继承-多态)

    框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...

  4. OC 多态

    OC 多态 多态的概念 没有继承,就没有多态 不同类的对象能够定义相同名称的方法 当父类对象的指针或引用指向子类对象时,会进行动态监测,调用真实的方法 C++只有虚函数才能实现多态,OC中所有方法都可 ...

  5. Objective 多态

    多态的特点 1.没有继承就没有多态 2.代码的体现:父类类型的指针指向子类对象 3.好处:如果函数方法参数中使用的是父类类型,则可以传入父类和子类对象,而不用再去定义多个函数来和相应的类进行匹配了. ...

  6. iOS之07-三大特性之多态 + NSString类

    多态 1.没有继承就没有多态 2.代码体现:父类类型的指针指向子类对象 类的创建: #import <Foundation/Foundation.h> // 动物 @interface A ...

  7. OC面向对象—多态

    OC面向对象—多态 一.基本概念 多态在代码中的体现,即为多种形态,必须要有继承,没有继承就没有多态. 在使用多态是,会进行动态检测,以调用真实的对象方法. 多态在代码中的体现即父类指针指向子类对象. ...

  8. 黑马程序员——OC语言 三大特性之多态

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) 三大特性之一的多态 (一)多态的基本概念 OC对象具有多态性体现在 Per ...

  9. OC面向对象—多态

    OC面向对象—多态 一.基本概念 多态是基于继承的基础之上的,多态可以使得父类的指针指向子类的对象.如果函数或参数中使用的是父类类型,可以传入父类.子类对象,但是父类类型的变量不能直接调用子类特有的方 ...

随机推荐

  1. JDK_Proxy_InvocationHandler_动态代理

    本文用jdk动态代理模拟了spring的AOP的实现技术 AOP面向切面编程,可用于权限验证,效率检查,事务,异常管理等 JDK的动态代理主要涉及到java.lang.reflect包中的两个类:Pr ...

  2. 结构体buf_page_t

    /** Buffer page (uncompressed or compressed) */ typedef struct buf_page_struct buf_page_t; struct bu ...

  3. Hibernate4.x之入门篇

    Hibernate作为一个优秀的持久化框架.ORM框架.在日常的Java开发中常常用到.本文主要通过一个简单的例子来介绍下Hibernate4.x的入门知识. 新建一个Java项目,并加入Hibern ...

  4. 浅析WCF与WebService、WPF与Silverlight 区别

    由于在<Windows服务调用Quartz.net 实现消息调度>中,涉及到ASP.NET Web Service //WebServiceSoapClient client = new ...

  5. JS组件Bootstrap实现弹出框和提示框效果代码

    这篇文章主要介绍了JS组件Bootstrap实现弹出框和提示框效果代码,对弹出框和提示框感兴趣的小伙伴们可以参考一下 前言:对于Web开发人员,弹出框和提示框的使用肯定不会陌生,比如常见的表格新增和编 ...

  6. C#发送简单的HTTP POST请求给传统的ASP网页。

    设计思路 创建HTTPWebRequest类的一个实例,设置这个对象的Method属性为"POST",ContentType属性为"application/x-/www- ...

  7. python错误收集

    Installing 'flask'You are using pip version 6.1.1, however version 7.1.2 is available.You should con ...

  8. ubuntu安装和卸载软件命令

    ubuntu安装和卸载软件命令 Ubuntu软件安装与删除相关命令 安装软件 命令: apt-get install softname1 softname2 softname3…… 卸载软件 命令: ...

  9. mybatis系列-01-JDBC

    1.1     环境 java环境:jdk1.7.0_79 eclipse mysql:5.7 1.2     创建mysql数据 导入下边的脚本: 导入之后数据库: sql_table.sql:记录 ...

  10. 从代码都发布遇到的问题总结(C#调用非托管dll文件,部署项目) 转

    http://www.cnblogs.com/Purple_Xiapei/archive/2012/06/30/2570928.html