从C++11开始,继承体系新增关键字overridefinal,让继承和成员函数覆盖更加规范和安全,在编译期做了保证。

override关键字

在成员函数的声明或定义中,override表示该成员方法是virtual的,并且是用来覆盖基类的虚函数。

例子:

struct A
{
  virtual void foo() {}
  void bar() {}
};

struct B : A
{
  // Error: 签名不匹配,非const
  // void foo() const override;
  
  // 签名匹配 B::foo overrides A::foo
  void foo() override {}
  
  // Error: A::bar 非 virtual
  // void bar() override;
};

final关键字

成员函数声明

当final用在virtual函数的声明或定义中,确保该方法是virtual的(无论是当前直接声明为virtual或者从基类继承的virtual方法),并且不能再在派生类中覆盖。

struct A
{
  virtual void foo() final {}
  
  // Error: 非虚函数不能设为final
  //void bar() final;
  
  virtual void bar2() {}
};

// struct B is final
struct B final : A
{
  // foo不能再覆盖
  // void foo();
  
  void bar2() final {}
};

类声明

当类声明用final修饰后,表示该类不能被继承