• 05多态


    1)多态基本概念

        1)静态多态:函数重载运算符重载 ----函数地址早绑定:编译阶段确定函数地址

        2)动态多态:派生类 虚函数 实现运行时多态 -----函数地址晚绑定:运行阶段确定函数地址

              1)动态多态满足条件:

                ----有继承关系

                ----子类重写父类的虚函数

              2)动态多态使用

                ----父类的指针或引用 指向子类对象

                    ---- Base *base = new Son;----通过指针指向子类对象(new在堆区需要手动delete释放)----base->func();

                    ----Base &base = Son son;----通过引用指向子类对象

              

    class Animal
    {
    public:
        virtual void speak()
        {
            cout << "动物在说话" << endl;
        }
    };

    class Cat :  public Animal
    {
        virtual void speak()
        {
            cout << "小猫在说话:喵喵喵~" << endl;
        }
    };

    void doSpeak(Animal& animal)
    {
        animal.speak();
    }

    void test1()
    {
        Cat cat;
        doSpeak(cat);
    }

    加入virtual前后运行结果

    2)多态原理剖析

        有无virtual关键字Animal类的占用字节数

        

         Animal类内部结构

          vfptr---指向---->vftable----表内记录虚函数的地址

                    --&Animal::speak  

        Cat类内部结构

          vfptr---指向---->vftable

                    --&Cat::speak(当子类重写父类的虚函数时,子类的虚函数表 内部 会替换成子类虚地址)

        解释如下------虚函数指针

      ·  

        

    3)多态实例---计算器类

        在真正开发中提倡 --- 开闭原则:对拓展进行开放,对修改进行关闭----不需要动源码

        多态的好处----1)组织结构清晰

               2)可读性强

               3)对于前期和后期扩展以及维护性高

    4)纯虚函数和抽象类

        纯虚函数存在的意义:通常父类中虚函数的实现是毫无意义的,主要都是调用子类重写的内容

        纯虚函数语法: virtual 返回值类型 函数名 (参数列表) = 0;------存在纯虚函数的类----抽象类

        

        抽象类特点:

          ---无法实例化对象

          ---子类必须重写抽象类中的纯虚函数,否则也属于抽象类

    5)虚析构和纯虚析构

        解决的问题-----若子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码---导致堆区的数据释放不干净

            解决方式---将父类的析构函数改为虚析构或者纯虚析构

                  注意:纯虚析构需要声明,也需要实现。-可以类内声明,类外实现。

        虚析构和纯虚析构共性:

            1)解决父类指针释放子类对象

            2)需要有具体的函数实现---虚、纯虚都需要代码实现(若父类中也有数据开辟到堆区,就需要父类析构代码实现)--只有纯虚析构函数(无实现的)的类也不能实例化(所以纯虚析构函数也需要实现)

        区别:

            若是纯虚析构,该类属于抽象类,无法实例化对象

        

      

     

  • 相关阅读:
    【模块汇总】
    【葵花宝典@2020Python面试】
    【数据库汇总】
    【Python初阶汇总】
    【葵花宝典@职场动物园】
    【2020Python修炼记】web框架之Django实战-BBS-高仿版博客园
    【2020Python修炼记】web框架之 权限管理+Auth模块
    Java SE基础2:Class类与反射 反射破坏了封装吗?
    Java SE基础1:面向对象三大基本特性
    11.堆与堆的应用
  • 原文地址:https://www.cnblogs.com/MissZhang-154/p/13236991.html
Copyright © 2020-2023  润新知