一、final
C++中增加了final关键字,作用如下:
① 限制某个类不能被继承
② 或者某个虚函数不能被重写 
① 限制某个类不能被继承
// ① 限制某个类不能被继承,也就是说这个类不能有派生类
class Base{
public:
    virtual void print() {
        cout<<"Base class...";
    }
};
class Child final: public Base{
public:
    void test() {
        cout<<"Child class...";
    }
};
// error,语法错误
class GrandChild : public Child {
public:
};
/*
    总结:
        final修饰的Child类,派生类GrandChild类的继承是非法的,不允许的
*/ 

总结: final修饰的Child类,派生类GrandChild类的继承是非法的,不允许的 
② 或者某个虚函数不能被重写
若使用 final 修饰函数,只能修饰虚函数,并且要把 final 关键字放到类或者函数的后面
#include <iostream>
using namespace std;
/*
    1.final
    C++中增加了final关键字,作用如下:
        ① 限制某个类不能被继承
        ② 或者某个虚函数不能被重写
    若使用 final 修饰函数,只能修饰虚函数,并且要把 final 关键字放到类或者函数的后面
*/
// 基类: base
class Base{
public:
    virtual void print() {
        cout<< "Base class..." <<endl;
    }
};
// 子类: Child
class Child : public Base {
public:
    void print() final {
        cout<< "Child class..." <<endl;
    }
};
// 孙子类: GrandChild
class GrandChild : public Child {
public:
    // 语法错误,不允许重写
    /*
    void print(){ //error: overriding final function ‘virtual void Child::print()’
        cout<<"GrandChild class...";
    }
    */
};
int main() {
    GrandChild gc;
    gc.print();//Child class...
    return 0;
}
/*
    总结:print()是基类中的一个虚函数,在子类中重写了这个方法,且使用了 final 关键字
         表示不希望孙子类继续重写这个方法了。因此孙子类对这个方法只能使用不能重写。
*/ 

总结:print()是基类中的一个虚函数,在子类中重写了这个方法,且使用了 final 关键字
      表示不希望孙子类继续重写这个方法了。因此孙子类对这个方法只能使用不能重写。 
二、override
override
    ① override关键字和final一样,需要写到方法的后面
    ② 确保在派生类中声明的重写函数与基类的虚函数有相同的签名
    ③ 表明将会重写基类的虚函数,可保证重写的虚函数的正确性
    ④ 提高代码可读性 
#include<iostream>
using namespace std;
/*
    override
    ① override关键字和final一样,需要写到方法的后面
    ② 确保在派生类中声明的重写函数与基类的虚函数有相同的签名
    ③ 表明将会重写基类的虚函数,可保证重写的虚函数的正确性
    ④ 提高代码可读性
*/
// 基类: Base
class Base{
public:
    virtual void print() {
        cout<<"Base class...\n";
    }
};
// 子类: Child
class Child : public Base{
public:
    void print() override {
        cout<<"Child class...\n";
    }
};
// 孙子类: GrandChild
class GrandChild : public Child{
public:
    void print() override {
        cout<<"GrandChild class...\n";
    }
};
int main() {
    Base bs;
    Child cd;
    GrandChild gc;
    bs.print();
    cd.print();
    gc.print();
    return 0;
} 

若派生类指定了要重写父类的print()方法,使用了 override关键字之后,若写错函数名或者函数参数或者返回值,那么编译器都会提示语法错误,因此有利于提高程序的正确性,降低出错的概率。


学习和参考一下文章:
final和override | 爱编程的大丙 (subingwen.cn)
https://subingwen.cn/cpp/final/
















![Javascript 数据结构[入门]](https://img-blog.csdnimg.cn/083e22ef77cd4326a05791a0b41e9c51.png)


