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()  { std::cout << "base_class::show()\n"; }
	
	// 用作測試 final 關鍵字的函數
	virtual void say() final { std::cout << "base_class::say()\n"; }
};

派生類

class demo_class : public base_class
{
public:
	// override的作用:指明該函數時重載的基類中的一個函數
	// 這里明確指明該函數是繼承基類的show函數
	virtual void show() override { std::cout << "demo_class::show()\n"; }

	// 編譯錯誤: error C3248: “base_class::say”: 聲明為“final”的函數無法被“demo_class::say”重寫
	// virtual void say() override { std::cout << "demo_class::say()\n"; }
};

純虛函數

純虛函數一種特殊的虛函數。 but,純虛函數通常用作基類定義接口。 顯然,純虛函數不能使用關鍵字override. 那 final 關鍵字呢? 一個例子:

class base_class
{
public:
	virtual void run() final = 0;
};

理論分析: 純虛函數 run 使用關鍵字 final后,run函數不能被派生類(子類)繼承並實現,且語法也正確。 實際: 編譯通過。
but類base_class及繼承自base_class的類均無法創建對象。因為: base_class的run函數是一個純虛函數且無法被派生類繼承。

結論: 純虛函數使用final關鍵字,無實際意義。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM