override

class A
{
  virtual void foo();
}
class B : public A
{
  void foo(); //OK
  virtual void foo(); // OK
  void foo() override; //OK
}

如果不使用override,当你手一抖,将foo()写成了f00()会怎么样呢?结果是编译器并不会报错,因为

它并不知道你的目的是重写虚函数,而是把它当成了新的函数。如果这个虚函数很重要的话,那就会对

整个程序不利。所以,override的作用就出来了,它指定了子类的这个虚函数是重写的父类的,如果你

名字不小心打错了的话,编译器是不会编译通过的。

final

final关键字后被继承或重写,编译器会报错。例子如下:

class Base
{
  virtual void foo();
};
class A : public Base
{
  void foo() final; // foo 被override并且是最后一个override,在其子类中不可以重写
};
class B final : A // 指明B是不可以被继承的
{
  void foo() override; // Error: 在A中已经被final了
};
class C : B // Error: B is final
{

};