博客
关于我
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/

    你可能感兴趣的文章
    NAS个人云存储服务器搭建
    查看>>
    NAS服务器有哪些优势
    查看>>
    NAT PAT故障排除实战指南:从原理到技巧的深度探索
    查看>>
    nat 网卡间数据包转发_你是不是从来没有了解过光纤网卡,它跟普通网卡有什么区别?...
    查看>>
    NAT-DDNS内网穿透技术,快解析DDNS的优势
    查看>>
    NAT-DDNS内网穿透技术,快解析DDNS的优势
    查看>>
    NAT-DDNS内网穿透技术,解决动态域名解析难题
    查看>>
    natapp搭建外网服务器
    查看>>
    NativePHP:使用PHP构建跨平台桌面应用的新框架
    查看>>
    nativescript(angular2)——ListView组件
    查看>>
    NativeWindow_01
    查看>>
    Native方式运行Fabric(非Docker方式)
    查看>>
    Nature | 电子学“超构器件”, 从零基础到精通,收藏这篇就够了!
    查看>>
    Nature和Science同时报道,新疆出土四千年前遗骸完成DNA测序,证实并非移民而是土著...
    查看>>
    Nature封面:只低一毫米,时间也会变慢!叶军团队首次在毫米尺度验证广义相对论...
    查看>>
    Nat、端口映射、内网穿透有什么区别?
    查看>>
    Nat、端口映射、内网穿透有什么区别?
    查看>>
    nat打洞原理和实现
    查看>>
    NAT技术
    查看>>
    NAT模式/路由模式/全路由模式 (转)
    查看>>