虚函数和多态
- 虚函数
- 在类的定义中,前面有virtual类关键字的成员函数就是虚函数
class base{
virtual int get();
};
int base::get(){}
- virtual关键字只用在类定义里的函数声明,写函数体时不用
- 构造函数和静态成员函数不能是虚函数
- 虚函数可以参与多态,普通函数不能
- 多态的表现形式一
- 派生类的指针可以赋给基类指针
- 通过基类指针指向一个基类和派生类中的同名虚函数时
- 若该指针指向一个基类对象,那么被调用的是基类的虚函数
- 若该指针指向一个派生类的对象,那么被调用的是派生类的虚函数
-这种机制就叫做多态
- 多态的表现形式二
- 派生类的对象可以赋给基类引用
- 通过基类引用调用基类和派生类中的同名虚函数时
- 若该引用引用的是一个基类的对象,则基类的虚函数被调用
- 若该引用引用的是一个派生类对象,则拍摄类的虚函数被调用
- 这种机制也叫多态
- 杂
- 在非构造函数,非析构函数的成员函数中调用虚函数是多态
- 在构造函数和析构函数中调用虚函数不是多态,编译时即可确定调用的函数是自己的类或基类中定义的函数,不会等到运行时才决定调用自己的还是派生类的函数
- 派生类中和基类虚函数同名同参数表的函数,不加virtual也自动成为虚函数
- 虚析构函数
- 通过基类的指针删除派生类对象时,通常只调用基类的析构函数(对于new出来的)
- 但是不调用派生类的析构函数是不行的
- 解决办法:
- 把基类的析构函数声明为virtual
- 派生类的析构函数可以virtual不进行声明
- 通过基类的指针删除派生类对象时,首先调用派生类的析构函数,然后调用基类的析构函数
- 一般来说,一个类如果定义了虚函数,则应该将析构函数也定义成虚函数,或者一个类打算作为基类使用,也应将析构函数定义成虚函数
- 注意:不允许以虚函数作为构造函数
原文地址:https://www.cnblogs.com/2002ljy/p/12305526.html
时间: 2024-10-03 21:41:12