虚函数和多态

Posted 2002ljy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了虚函数和多态相关的知识,希望对你有一定的参考价值。

虚函数和多态

- 虚函数

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

- 多态的表现形式一

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

- 多态的表现形式二

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

- 杂

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

- 虚析构函数

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

以上是关于虚函数和多态的主要内容,如果未能解决你的问题,请参考以下文章

虚函数探秘

C++学习摘要之四:虚函数和多态

在c++中虚函数和多态性是啥意思

虚函数和模板的用途区别

虚函数和多态

[ C++ ] 多态原理 多态