這兩個特色很少被提及,寫起來,免得忘了。
final
如何防止一個類別被繼承(雖然我想不到為什麼要這麼作),以前可以用虛擬繼承來防止。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| template <typename T> class Base { friend typename T; private: Base() {} }; class Derived : public virtual Base <Derived> { public: Derived() :Base() {} }; class MoreDerived : public Derived { public: MoreDerived() :Derived() {} };
|
其中的MoreDerived就被編譯器禁止生成。不過這樣寫實在很麻煩,於是在C++11之後友更簡單的方式。
1 2 3 4 5 6 7 8
| class Base final { public: Base() {} }; class Derived : public Base { public: Derived() {} };
|
這邊只要加上final
關鍵自救能達到一樣的效果。等同於C#的sealed。
同樣的,C++11也從C#跟Java借鑒了不少特色
防止虛擬函數函數被override
1 2 3 4 5 6 7 8 9 10
| class Base { public: Base() {} virtual void show() final {} }; class Derived : public Base { public: Derived() {} void show() {} // Compile error };
|
override
override顧名思義就是檢查BaseClass之中,有沒有同樣Signature的函式宣告,如果沒有的話,就會爆錯。免得產生新的函數而不自知。
1 2 3 4 5 6 7 8 9
| class Base { public: virtual void show(int) {} }; class Derived : public Base { public: void show(int) override {} void show(double) override {} // Compile error };
|
在上面的例子中,可以看到Base沒有show(double)
這個Signature的宣告,因此Compiler會報錯。
因此我們可以透過 pure virtual function
在編譯時檢查每個subclass都有實做此函數,而用override來檢查這函數是在VTable中。