C++11之重寫說明符override和final
阿新 • • 發佈:2020-10-25
關於
本文程式碼演示環境: win10 + vs2017
一個困擾
之前MFC用的多了,發現一個問題: 子類視窗的這個函式是否過載了基類的函式。解決辦法是: 開啟基類的程式碼,一個個排查。
這只是一個具體化的例子。
override 和 final
c++11引入關鍵字 override和final 用來解決繼承中虛擬函式的問題。
關鍵字 | 作用 |
---|---|
override | 指明該函式是過載的基類中的一個函式 |
final | A.禁止該函式從基類繼承;B.禁止該函式的過載 |
用法
注意: 這倆關鍵字 必須作用於虛擬函式。否則,編譯提示將出錯。
錯誤示範
程式碼
class case_err { public: // 錯誤,編譯器提示: error C3668: “case_err::name()”: 包含重寫說明符“override”的方法沒有重寫任何基類方法 void name() override {} // error C3609: “demo_class::gender”: “final”函式必須是虛擬函式 void gender() final {} };
正確用法
基類
class base_class
{
public:
// 用作測試 override 關鍵字的函式
virtual void show() { cout << "B::show()\n"; }
// 用作測試 final 關鍵字的函式
virtual void say() final { cout << "B::say()\n"; }
};
派生類
class demo_class : public base_class { public: // override的作用:指明該函式時過載的基類中的一個函式 // 這裡明確指明該函式是繼承基類的show函式 virtual void show() override { cout << "C::show()\n"; } // 編譯錯誤: error C3248: “base_class::say”: 宣告為“final”的函式無法被“demo_class::say”重寫 // virtual void say() override { cout << "C::say()\n"; } };