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
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!