c的override關鍵字什麼意思

2021-08-29 07:53:06 字數 3012 閱讀 2410

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語言的關鍵字都是什麼,c語言的37個關鍵字都是什麼

都好亂 32個關鍵字的是ansi1989年提出的。37個關鍵字的是ansi1999年提出的。注意這是針對c語言的。c99在c89的基礎上增加了5個關鍵字 bool imaginary restrict complex inline 加上32個剛好37個 怎麼現在c語言變成37個關鍵字了?原先的c89...

c語言中跳出if語句的關鍵字是什麼

1 goto語句 goto語句也稱作無條件轉移語句,其一般格式為goto語句標號 其中語句標號是按照識別符號規定書寫的符號,放在某一行語句行的前面,標號後加冒號 goto語句放語義是改變程式流向,轉去執行語句標號所標識的語句,其通常與條件語句配合使用,可用來實現條件轉移,構成迴圈,跳出迴圈體等功能。...

請輸入關鍵字

醫院用的氧氣瓶 是 固定資產!什麼是固定資產?屬於產品生產過程中用來改變或者影響勞動物件的勞動資料,是固定資本的實物形態。固定資產在生產過程中可以長期發揮作用,長期保持原有的實物形態,但其價值則隨著企業生產經營活動而逐漸地轉移到產品成本中去,並構成產品價值的一個組成部分。根據重要原則,一個企業把勞動...