博客
关于我
C++ 多态的原理
阅读量:794 次
发布时间:2019-03-24

本文共 1009 字,大约阅读时间需要 3 分钟。

多态(Polymorphism)是面向对象编程中一个核心概念,用于解决抽象编程的问题。它使得程序能够在不关心具体对象类型的情况下,正确调用方法。以下是关于多态的详细解析:

  • 多态的作用

    多态的主要目的是让程序能够处理不同类型的对象,而无需关心这些对象的具体类型。通过多态,程序可以在运行时根据对象的类型动态决定如何处理,这极大地提高了程序的灵活性和扩展性。

  • 多态的实现机制

    在C++中,多态的实现依赖于虚方法(Virtual Method)。要实现多态,必须满足两个条件:

    • 表面类型(即显示的类型)与实际类型(真实类型)不同。
    • 方法是通过虚方法来实现的。
    1. 多态的实现原理
      多态的核心机制在于通过指针或引用来指向对象,而这些对象在内存中包含一个虚方法表指针。无论是父类对象还是子类对象,这个虚方法表指针的位置都是一样的。虚方法表本身是一个数组,存储了各种方法的地址。
      • 当子类继承父类时,子类会复制父类的虚方法表。
      • 对于重写的虚方法,子类会替换父类的方法指针,确保调用的是子类特定版本的方法。
      • 对于新增的虚方法,会添加到虚方法表的末尾。
      1. 多态的实际表现
        通过一个常见的例子来理解多态:考虑如下代码:
      2. Animal* pa = new Dog();  
        pa->Say();

        在编译阶段,这条代码会被翻译为:

        pa->pFunArray[0]()

        这里的pFunArray是虚方法表指针,pFunArray[0]对应的是Animal类的第一个虚方法。当子类(Dog)继承父类(Animal)时,Dog会替换父类的虚方法表,确保调用的是子类特定的方法。

        1. 多态的局限性
          尽管多态非常有用,但它也存在一些缺陷。
          • 内存浪费:子类需要复制父类的虚方法表,且只对重写的方法进行替换。因此,如果父类有1000个虚方法,而子类只重写了一个,剩下的999个方法都会有两个副本,导致内存占用增加。
          • 性能开销:当类继承层次深,且类的数量多时,虚方法表的复制和管理会对性能产生负面影响。
          1. 解决多态问题的方法
            为了缓解多态的内存和性能问题,可以采用以下策略:
            • 只保存重写的虚方法:对于没有重写的方法,直接引用父类的虚方法表。
            • 使用哈希表优化:通过哈希表记录每个虚方法的实际调用地址,避免重复存储未重写的方法,从而减少内存占用。这种方法类似于现代C++中的std::visit功能。

            通过以上机制,多态能够在保证程序灵活性的同时,尽量减少内存和性能的开销。

    转载地址:http://loyuk.baihongyu.com/

    你可能感兴趣的文章
    Python 列表删除相同的元素
    查看>>
    Python 初学者需要知道的四条建议
    查看>>
    Python 判断字符串是否包含子字符串
    查看>>
    python 判断当前时间是否为零点
    查看>>
    python 利用pandas读取本地中CSV文件的指定列 列名重命名 并保存回本地
    查看>>
    python 利用pyspark读取HDFS中CSV文件的指定列 列名重命名 并保存回HDFS
    查看>>
    python 利用pyttsx3文字转语音
    查看>>
    python 利用已有Ner模型进行数据清洗合并
    查看>>
    python 到大数据开发工程师_如何成为一个大数据开发工程师?
    查看>>
    python 加密解密(base64, AES)
    查看>>
    Python 和Java 哪个更适合做自动化测试?
    查看>>
    python 图片转ico
    查看>>
    python 图片转文字、语音转文字、文字转语音保存音频并朗读
    查看>>
    python 在包含类似字符\x16、\x12、\x某某的数组中将以\x开头的字符找出来的方法
    查看>>
    Python 在并行进程之间共享字典
    查看>>
    Python 垃圾收集器文档
    查看>>
    python 基于 wordcloud + jieba + matplotlib 生成词云
    查看>>
    python 基于detectron或mask_rcnn的mask遮罩区域进行图片截取
    查看>>
    Python 基础 - Day 5 Learning Note - 模块 之 标准库:time (1)
    查看>>
    python 基础第七篇
    查看>>