虚函数主要解决的问题
虚函数是为了在解决基类与派生类中的存在的同名函数之间访问问题而产生的。简单来说就是对于同一个成员函数,如果用一个基类的指针去访问派生类的这个同名成员函数的话, 结果其实是访问的基类的该成员函数,产生了与本意不同的结果。
虚函数
虚函数是动态绑定的基础,必须是非静态成员函数才能声明为虚函数。声明为虚函数之后就可以通过基类的指针来访问派生类中相应的成员函数,
类中定义虚函数的方法
使用关键字 virtual来修饰。下面包括了普通虚函数和虚析构函数。
虚函数的声明只能出现在类定义中的函数原型声明中,而不能在成员函数实现的时候。
class Base1{
public:
virtual ~Base1();
virtual void display();
};
Base1::~Base1(){
cout<<"Calling Base1 destructor func."<<endl;
}
void Base1::display() {
cout<<"Calling Base1 func."<<endl;
}
一般虚函数的注意事项
基类中声明了虚函数,派生类中也可以不重写虚函数(但是这样就失去了定义虚函数的意义了)。
运行过程中的多态需要满足3个条件:
- 满足辅助兼容规则
- 声明是虚函数
- 由成员数调用或者通过指针、引用来访问虚函数
也可以声明虚析构函数,当使用基类指针操作派生类对象并且删除了派生类对象时,如果析构函数不是虚函数的话只会调用基类的析构函数,会导致派生类中申请一些内存不能被释放。
当派生类中没有显示给出虚函数声明时,系统会自动进行虚函数判断:
- 该函数是否与基类的虚函数有相同的名称
- 该函数是否与基类的虚函数有相同的参数个数以及相同的对应参数类型
- 该函数是否与基类的虚函数有相同的返回值或者满足赋值兼容规则的指针、引用型的返回值。
抽象类与纯虚函数
带有纯虚函数的类称为抽象类,抽象类不能直接定义对象,必须先用抽象类定义一个派生类,然后再用派生类定义一个对象。
纯虚函数定义方法
定义纯虚函数只需要声明即可, 不需要在抽象类中给出具体实现(也可以给出实现但是不会真正被实现),派生类必须重新实现纯虚函数。
class Base1{
public:
virtual ~Base1();
virtual void display()=0;
};
一个注意事项
抽象类中的纯虚函数在派生新的类时必须重写。
这个抽象类派生了一个派生类之后,再用派生类再去派生新的类之后就不用必须对抽象类中的纯虚函数重新实现。