zoukankan      html  css  js  c++  java
  • 虚函数和多态

    虚函数和多态

    - 虚函数

    • 在类的定义中,前面有virtual类关键字的成员函数就是虚函数
    class base{
        virtual int get();
    };
    int base::get(){}
    
    • virtual关键字只用在类定义里的函数声明,写函数体时不用
    • 构造函数和静态成员函数不能是虚函数
    • 虚函数可以参与多态,普通函数不能

    - 多态的表现形式一

    • 派生类的指针可以赋给基类指针
    • 通过基类指针指向一个基类和派生类中的同名虚函数时
      • 若该指针指向一个基类对象,那么被调用的是基类的虚函数
      • 若该指针指向一个派生类的对象,那么被调用的是派生类的虚函数
        -这种机制就叫做多态

    - 多态的表现形式二

    • 派生类的对象可以赋给基类引用
    • 通过基类引用调用基类和派生类中的同名虚函数时
      • 若该引用引用的是一个基类的对象,则基类的虚函数被调用
      • 若该引用引用的是一个派生类对象,则拍摄类的虚函数被调用
    • 这种机制也叫多态

    - 杂

    • 在非构造函数,非析构函数的成员函数中调用虚函数是多态
    • 在构造函数和析构函数中调用虚函数不是多态,编译时即可确定调用的函数是自己的类或基类中定义的函数,不会等到运行时才决定调用自己的还是派生类的函数
    • 派生类中和基类虚函数同名同参数表的函数,不加virtual也自动成为虚函数

    - 虚析构函数

    • 通过基类的指针删除派生类对象时,通常只调用基类的析构函数(对于new出来的)
    • 但是不调用派生类的析构函数是不行的
    • 解决办法:
      • 把基类的析构函数声明为virtual
      • 派生类的析构函数可以virtual不进行声明
      • 通过基类的指针删除派生类对象时,首先调用派生类的析构函数,然后调用基类的析构函数
    • 一般来说,一个类如果定义了虚函数,则应该将析构函数也定义成虚函数,或者一个类打算作为基类使用,也应将析构函数定义成虚函数
    • 注意:不允许以虚函数作为构造函数
  • 相关阅读:
    矩形交,线段交
    P1338 末日的传说(贪心)
    P1338 末日的传说(贪心)
    P2014 选课 (依赖性背包,树上背包) U53204 【数据加强版】选课(后序遍历优化)
    P2014 选课 (依赖性背包,树上背包) U53204 【数据加强版】选课(后序遍历优化)
    P1417 烹调方案(01背包 )
    P1417 烹调方案(01背包 )
    D. Pawn(记忆化搜索)
    蓝桥杯--数位递增的数
    汉诺塔递归算法C语言
  • 原文地址:https://www.cnblogs.com/2002ljy/p/12305526.html
Copyright © 2011-2022 走看看