c的override關鍵字什麼意思

時間 2021-08-30 11:13:07

1樓:

override保留字表示當前函式重寫了基類的虛擬函式。

在函式比較多的情況下可以提示讀者某個函式重寫了基類虛擬函式,表示這個虛擬函式是從基類繼承,不是派生類自己定義的;強制編譯器檢查某個函式是否重寫基類虛擬函式,如果沒有則報錯。在類的成員函式引數列表後面新增該關鍵字既可。

override只是c++保留字,不是關鍵字,這意味著只有在正確的使用位置,oerride才啟“關鍵字”的作用,其他地方可以作為標誌符,如:intoverride;是合法的。

擴充套件資料override的使用,示例:

classbase{

virtualvoidf();

classderived:publicbase{voidf()override;//表示派生類重寫基類虛擬函式fvoidf()override;//錯誤:函式f沒有重寫基類任何虛擬函式

2樓:

在c++11中為了幫助程式設計師寫繼承結構複雜的型別,引入了虛擬函式描述符override,如果派生類在虛擬函式宣告時使用了override描述符,那麼該函式必須過載其基類中的同名函式,否則**將無法通過編譯。我們來看一下如**清單2-25所示的這個簡單的例子。

**清單2-25

struct base ;

struct derivedmid: public base ;

struct derivedtop : public derivedmid ;

// 編譯選項:g++ -c -std=c++11 2-10-3.cpp

在**清單2-25中,我們在基類base中定義了一些virtual的函式(介面)以及一個非virtual的函式print。其派生類derivedmid中,基類的base的介面都沒有過載,不過通過註釋可以發現,derivedmid的作者曾經想要過載出一個“void vneumann(double g)”的版本。這行註釋顯然迷惑了編寫derivedtop的程式設計師,所以derivedtop的作者在過載所有base類的介面的時候,犯下了3種不同的錯誤:

函式名拼寫錯,dijkstra誤寫作了dikjstra。

函式原型不匹配,vneumann函式的引數型別誤做了double型別,而dknuth的常量性在派生類中被取消了。

重寫了非虛擬函式print。

如果沒有override修飾符,在**清單2-25中,derivedtop作者的4處可以編譯過去 但是與他的願意(想過載虛擬函式)有嚴重的偏差了 但是編譯器不報錯,繼續編譯下去 這樣就難排查了。加上關鍵字override 這樣編譯器可以輔助檢查是不是正確過載 。如果沒有override修飾符 derivedtop的作者可能在編譯後都沒有意識到自己犯了這麼多錯誤。

因為編譯器對以上3種錯誤不會有任何的警示。這裡override修飾符則可以保證編譯器輔助地做一些檢查。我們可以看到,在**清單2-25中,derivedtop作者的4處錯誤都無法通過編譯。

此外,值得指出的是,在c++中,如果一個派生類的編寫者自認為新寫了一個介面,而實際上卻過載了一個底層的介面(一些簡單的名字如get、set、print就容易出現這樣的狀況),出現這種情況編譯器還是愛莫能助的。不過這樣無意中的過載一般不會帶來太大的問題,因為派生類的變數如果呼叫了該介面,除了可能存在的一些虛擬函式開銷外,仍然會執行派生類的版本。因此編譯器也就沒有必要提供檢查“非過載”的狀況。

而檢查“一定過載”的override關鍵字,對程式設計師的實際應用則會更有意義。

還有值得注意的是,如我們在第1章中提到的,final/override也可以定義為正常變數名,只有在其出現在函式後時才是能夠控制繼承/派生的關鍵字。通過這樣的設計,很多含有final/override變數或者函式名的c++98**就能夠被c++編譯器編譯通過了。但出於安全考慮,建議讀者在c++11**中應該儘可能地避免這樣的變數名稱或將其定義在巨集中,以防發生不必要的錯誤。

建議:如果派生類裡面是像過載虛擬函式 就加上關鍵字override 這樣編譯器可以輔助檢查是不是正確過載,如果沒加這個關鍵字 也沒什麼嚴重的error 只是少了編譯器檢查的安全性

3樓:匿名使用者

描述:override保留字表示當前函式重寫了基類的虛擬函式。

目的:1.在函式比較多的情況下可以提示讀者某個函式重寫了基類虛擬函式(表示這個虛擬函式是從基類繼承,不是派生類自己定義的);2.

強制編譯器檢查某個函式是否重寫基類虛擬函式,如果沒有則報錯。

用法:在類的成員函式引數列表後面新增該關鍵字既可。

例子:class base {

virtual void f();

};class derived : public base ;

注意:override只是c++保留字,不是關鍵字,這意味著只有在正確的使用位置,oerride才啟“關鍵字”的作用,其他地方可以作為標誌符(如:int override;是合法的)。

相關:override還有一個姊妹保留字final。

vc++編譯器支援情況: vs2008,vs2010,vs2012,vs2013,+

注: override為標準c++保留字,並非vs特有,目前主流的編譯器的新版本都支援該保留字。

4樓:

1、override關鍵字,可以讓編譯器檢測到很難發現的程式錯誤。這個錯誤在於,override關鍵字表明,g(double)雖然想要進行override的操作,但實際父類並沒有這麼個函式。

值得注意的是,這些並不是一些語法糖,而是能確確實實地避免很多程式錯誤,並且暗示編譯器可以作出一些優化。

2、例程:

struct b4

};struct d4 : b4

// ok

virtual void g(double) override {} // error};

5樓:匿名使用者

1,他是編譯器裡的。

2,overrie下面的函式是系統有的

3,可以重寫,

6樓:惡靈的加護

c++沒有override關鍵字,但是c#有。

c#是微軟釋出的語言,所以如果你是用的vs的話,會把override給標記了。

C中關鍵字ref和out的區別,c 中ref和out關鍵字的用法,以及有什麼不同,求大神解答,線上等

山東中公優就業 1 兩者都是按地址傳遞的,使用後都將改變原來引數的數值。2 ref可以把引數的數值傳遞進函式,但是out是要把引數清空,就是說你無法把一個數值從out傳遞進去的,out進去後,引數的數值為空,所以你必須初始化一次。這個就是兩個的區別,或者說就像有的說的,ref是有進有出,out是隻出...

Signed 是什麼意思,C語言中的關鍵字是什麼意思

adj.有符號的 已簽字的 有正負之分的 v.署名 寫下 預示 示意 sign的過去分詞 1.帶正負號 signature 簽名.signed 帶正負號.significance 有效 2.有符號的 signaled state 終止狀態.signed 有符號的.significand 有效數 3....

在C 中,使用const關鍵字而不是define語句的好處有哪些

define與const的概念 巨集不僅可以用來代替常數值,還可以用來代替表示式,甚至是 段。巨集的功能很強大,但也容易出錯,所以其利弊大小頗有爭議。用巨集來代表常數,好處是 1.讓 更簡潔明瞭 當然這有賴於你為巨集取乙個適當的名字。一般來說,巨集的名字更要注重有明確直觀的意義,有時寧可讓它長點。2...