天天看點

C++中override關鍵字

本文轉自:https://blog.csdn.net/xiaoheibaqi/article/details/51272009

  1. override關鍵字作用: 

    如果派生類在虛函數聲明時使用了override描述符,那麼該函數必須重載其基類中的同名函數,否則代碼将無法通過編譯。

  2. 舉例子說明
  3. 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會報錯以外,其他函數都不會有問題,但是在類執行個體化的時候會提示是抽象類,因為他們都沒有真正實作重載,以下為添加override關鍵字後的代碼
    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 隻是少了編譯器檢查的安全性

繼續閱讀