码迷,mamicode.com
首页 > 其他好文 > 详细

虚函数和多态

时间:2020-02-13 22:51:57      阅读:100      评论:0      收藏:0      [点我收藏+]

标签:同名   解决办法   静态成员函数   ase   形式   函数声明   通过   int   构造函数   

虚函数和多态

- 虚函数

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

- 多态的表现形式一

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

- 多态的表现形式二

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

- 杂

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

- 虚析构函数

  • 通过基类的指针删除派生类对象时,通常只调用基类的析构函数(对于new出来的)
  • 但是不调用派生类的析构函数是不行的
  • 解决办法:
    • 把基类的析构函数声明为virtual
    • 派生类的析构函数可以virtual不进行声明
    • 通过基类的指针删除派生类对象时,首先调用派生类的析构函数,然后调用基类的析构函数
  • 一般来说,一个类如果定义了虚函数,则应该将析构函数也定义成虚函数,或者一个类打算作为基类使用,也应将析构函数定义成虚函数
  • 注意:不允许以虚函数作为构造函数

虚函数和多态

标签:同名   解决办法   静态成员函数   ase   形式   函数声明   通过   int   构造函数   

原文地址:https://www.cnblogs.com/2002ljy/p/12305526.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!