關於
本文代碼演示環境: 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() { 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關鍵字,無實際意義。