本文轉自:https://blog.csdn.net/xiaoheibaqi/article/details/51272009
-
override關鍵字作用:
如果派生類在虛函數聲明時使用了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; //無法通過編譯,非虛函數重載 };
上面的1-5個重載函數編譯過程中,除了傳回值不同的infor會報錯以外,其他函數都不會有問題,但是在類執行個體化的時候會提示是抽象類,因為他們都沒有真正實作重載,以下為添加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 };
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 隻是少了編譯器檢查的安全性