一.final
用法:
1.修饰函数
只能修饰虚函数,阻止子类重写这个函数,final关键字写在函数名的后面。
即该虚函数不可以再被重写。
注意:一般不会在基类中使用,不然没有意义,因为只能修饰虚函数。
2.修饰类
表示该不能被继承,即无派生类。
使用示例:
#include <iostream>
using namespace std;class Base
{
public:virtual void test(){cout << "base class" <<endl;}
};class Child:public Base
{
public:void test() final //修饰虚函数{cout << "Chile class" <<endl;}
};class GrandChild final : public Child{ //修饰类
public:void test1(){}
};//错误,不能被继承
// class GGChild : public GrandChild
// {// }
二.override
用法:
重写,确保再派生类中声明的重写函数与基类的虚函数有相同的签名。(防止手误)
用于多态:
多态特征:
1.有继承关系
2.重写父类虚函数
3.父类指针指向子类对象
使用示例:
#include <iostream>
using namespace std;class Base
{
public:virtual void test(){cout << "base class" <<endl;}
};class Child:public Base
{
public:void test() {cout << "Chile class" <<endl;}
};class GrandChild : public Child{
public:void test() override //确保再派生类中声明的重写函数与基类的虚函数有相同的签名。{cout << "GrandChild class" <<endl;}
};int main()
{GrandChild Gd;Base* ptr = new Child();Base* ptr1 = &Gd;ptr->test();ptr1->test();Gd.test();return 0;
}
三.重写override和重载overload的区别
1.作用域不同
重写发生在不同的类(基类和子类)之间。
重载发生在同一个作用域内。
2.判断依据不同
重写依据函数签名是否相同以及基类函数是否为虚函数。
重载依据参数列表是否不同。
3.目的不同
重写的目的是实现运行时多态,让基类指针或引用能够根据实际指向的对象类型调用相应的函数。
重载的目的是为了方便用户使用,通过相同的函数名处理不同类型的数据,提高代码的可读性和易用性。