zoukankan      html  css  js  c++  java
  • 第六章 多态

    基本概念

    1. 目的:提升程序可扩充性
    2. 在类定义里的函数声明前加上virtual即是虚函数,在类外写函数体时不用加
    3. 构造函数和静态成员函数不能是虚函数
    4. 表现形式
      • 派生类对象赋值给基类指针,则当基类指针调用基类和派生类同名虚函数时,实际执行的函数是根据指针指向的对象
      • 派生类对象赋值给基类引用,同上。
      • 通过基类指针或引用调用虚函数,程序编译时不确定调用的基类或是派生类,直到运行时才确定——动态联编

    用法

    1. 用基类指针数组存放指向各种派生类对象的指针,然后遍历数组,实现对不同派生类的对象的操作,是一种比较常见的做法
    2. 派生类和基类中虚函数同名同参数表的函数,不加virtual也自动成为虚函数
    3. 类中非构造函数非析构函数内部调用虚函数时是多态(因为函数内包含的this指针);
    4. 类中的构造函数析构函数内部调用虚函数时不是多态,在编译时已确定(因为基类构造时,派生类的变量还未初始化;基类析构时,派生类已析构,若为多态,则可能出错)

    多态的实现原理

    1. 在每个包含虚函数的类及其派生类的对象存储空间首部,都包含着一个指向虚函数表的指针。调用虚函数时,程序会通过该指针运行指向的虚函数。
    2. 缺点:增加时间和空间的损耗

    虚析构函数

    1. 当类中存在虚函数或需要用基类指针或引用调用派生类时,应在基类虚构函数前加上virtual,派生类的析构函数不需要加virtual
    2. 否则,当用基类指针删除派生类对象时,只会调用基类析构函数,而不会调用派生类析构函数,析构不充分

    纯虚函数和抽象类

    1. 定义:没有函数体的虚函数称为纯虚函数,包含纯虚函数的类为抽象类

      virtual void Func()=0;
      
    2. 抽象类不能直接创建相应的对象,只能用于派生新类使用。抽象类指针可以指向派生出的对象

    3. 抽象类成员函数内部可以调用纯虚函数,但其构造函数&析构函数内不能直接调用[1]

    4. 派生类当且仅当实现基类中所有纯虚函数后,才不是抽象类


    1. 因为构造、析构函数内不是多态,所以不能直接调用纯虚函数 ↩︎

  • 相关阅读:
    Dubbo服务者消费者提供者案例实现
    spring核心组件
    spring为什么要注入接口
    小菜鸡进阶之路_Second week之元组、列表、集合、字典对比.
    小菜鸡进阶之路-First week
    光学公式推到——(物象位置) 1/u+1/v=1/f
    C#问题——调用事件时其他信息: 未将对象引用设置到对象的实例。
    工业相机全局曝光和卷帘曝光的区别
    相机加接圈的作用和缺点
    C#——数组维度/行数/列数/长度区别
  • 原文地址:https://www.cnblogs.com/DreamEagle/p/12632051.html
Copyright © 2011-2022 走看看