C++ 借由虚函数实现运⾏时多态,但 C++ 的虚函数⼜很多脆弱的地⽅:
⽆法禁止子类重写它。可能到某⼀层级时,我们不希望⼦类继续来重写当前虚函数了。
容易不小心隐藏⽗类的虚函数。⽐如在重写时,不小心声明了⼀个签名不⼀致但有同样名称的新函数。
C++11 提供了 final 来禁⽌虚函数被重/禁⽌类被继承, override 来显示地重写虚函 数。 这样编译器给我们不小心的⾏为提供更多有⽤的错误和警告。
struct Base1 final { };
struct Derived1 : Base1 {}; // 编译错:Base1不允许被继承
struct Base2 {
virtual void f1() final;
virtual void f2();
};
struct Derived2 : Base2 {
virtual void f1(); // 编译错:f1不允许᯿写
virtual void f2(int) override; // 编译错:⽗类中没有 void f2(int)
};