1. override:显示重写,强制编译器检查

  • 作用就是子类的函数重写父类的虚函数,如果签名不匹配,编译器直接报错,避免写错函数名、参数、const,造成没有完成重写,变成隐藏新函数。
  • override只是检测工具,本身不产生重写行为;必须父类是virtual虚函数。
#include <iostream>
using namespace std;
class Base
{
public:
    virtual void show()
    {
        cout << "Base::show" << endl;
    }
};
class Derived : public Base
{
public:
    // 写错参数,没有重写,而是新增一个函数,多态失效!
    void show(int a)
    {
        cout << "Derived::show" << endl;
    }
};
int main()
{
    Base* p = new Derived();
    p->show(); // 输出 Base::show,多态失效,但是编译器不报警告
    delete p;
    return 0;
}
  • 使用 override,编译直接捕获错误
class Derived : public Base
{
public:
    // 编译报错,父类没有 void show(int),重写失败
    void show(int a) override
    {
        cout << "Derived::show" << endl;
    }
};

正确写法

class Derived : public Base
{
public:
    void show() override // 签名完全匹配父类虚函数
    {
        cout << "Derived::show" << endl;
    }
};
  • 编码规范:重写虚函数,一律加上 override,杜绝隐形 bug。

2. final

修饰函数,禁止子类继续重写该虚函数

  • 父类虚函数加final,后续继承的子类不能重写这个函数,重写直接编译报错。
class Base
{
public:
    virtual void func() final
    {
        cout << "Base func" << endl;
    }
};

class Son : public Base
{
public:
    // 编译报错:func已经被final,不允许重写
    void func() override
    {

    }
};

修饰类,禁止这个类被继承

  • 类名后面加final,整个类禁止被继承,任何子类继承直接编译报错。
class grand final
{
};

// 编译报错,不能继承grand类
class Child : public grand
{
};

3. override he final 对比

特性 override final
作用 验证是否正确重写父类虚函数 1. 虚函数:禁止子类重写2. 类:禁止类被继承
修饰对象 只能修饰类内虚成员函数 可以修饰虚函数 / 整个类
能否写在父类 不能,只写在子类重写函数上 写在父类;类 final 写在类名后面
对普通函数 不能修饰普通函数 不能修饰普通函数
运行时效果 无,仅编译期检查 无,仅编译期限制

image