1. 程式人生 > 實用技巧 >C++11之重寫說明符override和final

C++11之重寫說明符override和final

關於

本文程式碼演示環境: win10 + vs2017

一個困擾

之前MFC用的多了,發現一個問題: 子類視窗的這個函式是否過載了基類的函式。解決辦法是: 開啟基類的程式碼,一個個排查。
這只是一個具體化的例子。

override 和 final

c++11引入關鍵字 overridefinal 用來解決繼承中虛擬函式的問題。

關鍵字 作用
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"; }
};