1. 程式人生 > >C++ 中關於override和final使用

C++ 中關於override和final使用

C++使用虛方法實現多型,讓基類引用或者指標能夠指向子類的對應的方法,從而實現多型。

1、但是也會出現一些問題,例如基類中聲明瞭一個虛方法,但是在派生類中提供了不同版本的方法,就會隱藏掉子類中的方法。

#pragma once
#include <iostream>
class Base {
public:
    Base();
    virtual ~Base();
    virtual void fun(char ch)  {
        std::cout << ch << "Base \n";
    }
};

class Child : public
Base{ public: Child(); virtual ~Child(); virtual void fun(char* ch) { std::cout << ch << "Child \n"; } };

實際呼叫:

Child child;
child.fun("s");

輸出內容:
sChild
可以看待呼叫了子類的函式void fun(char* ch),加入這不是我們想要的,我們要實現父類中的虛擬函式,並且呼叫它,而不是重新寫一個函式。
這樣就用到了咱們的override說明符。

修改一個Child類,

class Child : public Base{
public:
    Child();
    virtual ~Child();

    virtual void fun(char* ch) override {
        std::cout << ch << "Child \n";
    }

};

編譯的時候就會報錯:

error C3668: “Child::fun”: 包含重寫說明符“override”的方法沒有重寫任何基類方法   

再次修改Child

virtual void fun(char* ch) override

這就提示我們必須過載父類中的虛擬函式方法。
2、如果我們想禁止類中覆蓋特定的虛方法,為此我們可在引數列表後面加上final。如果我們想禁止子類重寫fun函式,只需要這樣修改程式碼:

class Base {
public:
    Base();
    virtual ~Base();
    virtual void fun(char ch) final{
        std::cout << ch << "Base \n";
    }
};

說明:override和final並非C++中的關鍵字,而是具有特殊意義的識別符號。編譯器會根據上下文確定它們是否有特殊含義。