c的override關鍵字什麼意思

時間 2021-08-30 11:14:12

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語言中volatile關鍵字是什麼含義怎麼辦呢

影者東昇 c c 中的 volatile 關鍵字和 const 對應,用來修飾變數,通常用於建立語言級別的 memory barrier。volatile 關鍵字是一種型別修飾符,用它宣告的型別變數表示可以被某些編譯器未知的因素更改,比如 作業系統 硬體或者其它執行緒等。遇到這個關鍵字宣告的變數,編...

java this關鍵字的使用

未命名 this點後面的表示該類的成員變數 this.name name 表示 成員變數 stirng name 方法引數 string name 這樣寫增加可讀性 很規範!滿意請採納! 雖看似多餘,實際上增加了程式的可讀性,所以我覺得不多餘 this.name name這樣寫讓人看起來知道清楚如果...

C中在子類中訪問父類成員的關鍵字是什麼

最紳士的痞子灬 使用base.呼叫父類裡面的屬性 public class parent public class child parent 1 父類不能直接強制轉換成子類 2 子類可以強制轉換成父類,但是在父類中只能取父類的欄位與方法因此在一個父類對應多個子類的時候,不知道具體是哪個子類的時候,就...