C++——override和final


override關鍵字作用:
如果派生類在虛函數聲明時使用了override描述符,那么該函數必須重載其基類中的同名函數,否則代碼將無法通過編譯。
舉例子說明

struct Base
{
virtual void Turing() = 0;
virtual void Dijkstra() = 0;
virtual void VNeumann(int g) = 0;
virtual void DKnuth() const;
void Print();
};
struct DerivedMid: public Base
{
// void VNeumann(double g);
//接口被隔離了,曾想多一個版本的VNeumann函數
};
struct DerivedTop : public DerivedMid
{
void Turing() override;
void Dikjstra() override; //無法通過編譯,拼寫錯誤,並非重載
void VNeumann(double g) override; //無法通過編譯,參數不一致,並非重載
void DKnuth() override; //無法通過編譯,常量性不一致,並非重載
void Print() override; //無法通過編譯,非虛函數重載
};

(之前聽過,但是沒看過結構體重載 ==)

如果沒有使用override關鍵字,上面的寫法編譯可以通過但是運行的效果與真實意願(希望重載)不符
舉例子說明
class testoverride
{
public:
testoverride(void);
~testoverride(void);
virtual void show() const = 0;
virtual int infor() = 0;
virtual void test() = 0;
virtual int spell() = 0;
};

class B: public testoverride
{
public:
virtual void show(); //1
virtual void infor(); //2
virtual void vmendd(); //3
virtual void test(int x);//4
virtual void splle(); //5
};

上面的1-5個重載函數編譯過程中,除了返回值不同的infor會報錯以外,其他函數都不會有問題,但是在類實例化的時候會提示是抽象類,因為他們都沒有真正實現重載

class C: public testoverride
{
public:
virtual void show() override;
virtual void infor() override;
virtual void vmendd() override;
virtual void test(int x) override;
virtual void splle() override;
};

添加了override以后,會在編譯器override修飾符則可以保證編譯器輔助地做一些檢查,上面的情況無法通過編譯

結論
如果派生類里面是像重載虛函數 就加上關鍵字override 這樣編譯器可以輔助檢查是不是正確重載,如果沒加這個關鍵字 也沒什么嚴重的error 只是少了編譯器檢查的安全性

 1.override 讓編譯器幫你檢查函數是不是虛函數

struct B{
    virtual void f1(int) const;
    virtual void f2();
    void f3();
};

struct D1:B{
    virtual void f1(int) const override;//對,在B中能找到可以覆寫的f1(int)虛函數
    virtual void f2(int) override;//❌,B中沒有可以覆寫的f2(int)虛函數
    void f3() override;//錯,B中f3不是虛函數
    void f4() override; //錯,B中沒有f4
};

2.final至此后面繼承的類不能再覆寫了

struct D2:B{
    void f1(int) const final;//不許后面繼承的類覆寫此函數了
};
struct D3:D2{
    void f2();//正確
    void f1(int) const;//錯誤,不允許覆寫了

 

 


---------------------
作者:xiaoheibaqi
來源:CSDN
原文:https://blog.csdn.net/xiaoheibaqi/article/details/51272009
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

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



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