虚函数
virtual
指定非静态成员函数为虚函数并支持动态调用派发
虚函数是可在子类中重写定义的成员函数。当使用基类的指针或引用处理子类时,如果调用的是虚函数;则会调用子类中重写的虚函数
注:父类中存在虚函数;子类中的同名函数满足:1)名称;2)形参列表;3)cv限定符;4)引用 一致,则子类中的这个函数也是虚函数,不管有没有virtual关键字;同时会覆盖父类中的虚函数,不管有没有override后缀
cv限定符:
c:const 定义类型为常量
v:volatile 定义类型为易变
override
在成员函数声明或者定义中,override说明符确保该函数为虚函数并覆盖某个基类中的虚函数
个人理解:
子类中的函数名后缀override,编译器会对父类进行检测,检测父类中是否存在这个函数名的虚函数,如果没有就报错。
如果不加后缀override,编译器就不会自动检测,但是符合标准的重载事件依旧触发。
虚析构函数
析构函数不被继承,但是父类的析构函数声明为virtual,那么子类的析构函数会始终重写父类
class Father
{
public:
virtual ~Father(){std::cout<<"~Father\n";}
}
class Son:public Father
{
public
~Son(){std::cout<<"~son";}
}
int main()
{
Father*fa=new Son; //基类的指针指向子类
delete fa; //删除指针
}
/*
结果
1)调用基类Father的析构函数
2)因为基类Father的析构函数是虚函数,所有调用子类Son的析构函数
3)子类Son析构了,再调用基类Father的析构函数
*/
注:如果类是多态(声明或者基础了虚函数),且类析构函数不是虚函数; 这时删除时是未定义行为;所以,基类的析构函数必须是公开且虚,或者受保护且非虚
其他:
非成员函数和静态成员函数不能是虚函数;
纯虚函数
格式:
virtual void FunctionName()=0;
特征:
在子类中必须重新声明(不需要=0)并进行定义;而在基类中不需要定义
注:有纯虚函数的类是抽象类,不能生成对象,只能派生子类;如果子类仍然没有定义纯虚函数,那么这个子类还是抽象类