1. override 重載
當你在父類中使用了虛函數時候,你可能需要在某個子類中對這個虛函數進行重寫,以下方法都可以:
class A { virtual void foo(); } class B :public A { void foo(); //OK virtual foo(); // OK void foo() override; //OK }
如果不使用override,當你手一抖,將foo()寫成了f00()會怎么樣呢?結果是編譯器並不會報錯,因為它並不知道你的目的是重寫虛函數,而是把它當成了新的函數。如果這個虛函數很重要的話,那就會對整個程序不利。
所以,override的作用就出來了,它指定了子類的這個虛函數是重寫的父類的,如果你名字不小心打錯了的話,編譯器是不會編譯通過的:
class A { virtual void foo(); }; class B :A { virtual void f00(); //OK virtual void f0o()override; //Error };
為了減少程序的運行時錯誤,還是養成重寫虛函數加上override的習慣吧。
2.final
當不希望某個類被繼承,或不希望某個虛函數被重寫,可以在類名和虛函數后添加final關鍵字,添加final關鍵字后被繼承或重寫,編譯器會報錯。例子如下:
class Base { virtual void foo(); }; class A : Base { void foo() final; // foo 被override並且是最后一個override,在其子類中不可以重寫 void bar() final; // Error: 父類中沒有 bar虛函數可以被重寫或final }; class B final : A // 指明B是不可以被繼承的 { void foo() override; // Error: 在A中已經被final了 }; class C : B // Error: B is final { };