• 虚函数和多态


    虚函数和多态

    - 虚函数

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

    - 多态的表现形式一

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

    - 多态的表现形式二

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

    - 杂

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

    - 虚析构函数

    • 通过基类的指针删除派生类对象时,通常只调用基类的析构函数(对于new出来的)
    • 但是不调用派生类的析构函数是不行的
    • 解决办法:
      • 把基类的析构函数声明为virtual
      • 派生类的析构函数可以virtual不进行声明
      • 通过基类的指针删除派生类对象时,首先调用派生类的析构函数,然后调用基类的析构函数
    • 一般来说,一个类如果定义了虚函数,则应该将析构函数也定义成虚函数,或者一个类打算作为基类使用,也应将析构函数定义成虚函数
    • 注意:不允许以虚函数作为构造函数
  • 相关阅读:
    SQL Server:创建索引视图
    Asp.Net常用函数
    SQL Server联机丛书:删除存储过程
    音乐知识全接触
    深入透析样式表滤镜
    有一天,爸妈会变老
    今天终于买到票啦~~
    今天,回到上海啦~~(附工作生涯回顾)
    十八问:怎么才是喜欢编程
    把旧光驱改CD播放机的方法
  • 原文地址:https://www.cnblogs.com/2002ljy/p/12305526.html
Copyright © 2020-2023  润新知