對C 名字隱藏的理解

2021-07-04 23:30:24 字數 1143 閱讀 2416

overwrite(重寫):

是指派生類的函式遮蔽了與其同名的基類函式,規則如下:

(1)如果派生類的函式與基類的函式同名,但是引數不同。此時,不論有無virtual關鍵字,基類的函式將被隱藏(注意別與過載混淆)。

如何理解這句呢?看這個例子:

class

firstclass

;void

firstclass

::methoda

(inti)

void

firstclass

::methoda

(inti,

intj

)

上面的類中有兩個方法(過載的方法),如果你想在派生類中重寫乙個引數的函式, 你可以這麼做:

class

secondclass

:public

firstclass

;void

secondclass

::methoda

(inti)

intmain

()

上面的main函式中,第2個methoda在編譯時會報錯,提示沒有與之匹配的函式。 這是因為兩個引數的methoda在派生類中是不可見的,這就是名字隱藏。

名字隱藏與虛函式無關。所以不管基類中那兩個函式是不是虛函式, 在這裡都會發生名字隱藏。解決方法有兩個。第乙個是將2個引數的methoda換乙個名字, 那麼它在派生類中就可見了。但我們既然過載了methoda,說明它們只是引數不同, 而實際上應該是在做相同或是相似的事的。所以換掉名字並不是個好辦法。因此, 我們一般採用第二種方法,在派生類中重寫所有的過載函式,也就是還在基類中保留virtual,單子派生類中覆寫這兩個虛函式,這就不會隱藏了。

(2)如果派生類的函式與基類的函式同名,並且引數也相同,但是基類函式沒有virtual關鍵字。此時,基類的函式被隱藏(注意別與覆蓋混淆)。

這裡造成隱藏本質上違反了《effective c++》中的「絕不重定義繼承而來的非虛函式」,因為此時當你通過指標或引用指向乙個物件呼叫非虛函式,具體呼叫哪個不再取決於該物件的型別,而是取決於指標或引用的型別,也就是由指標的靜態型別來決議函式呼叫,另外,非虛函式本身體現的就是不變性而非特異性。

C 之名字隱藏

在c 中,當你使用乙個包含了過載方法的類時,並且當你繼承和重寫這個方法後,你必須重寫所有過載的方法。例子 class firstclass void firstclass methoda int i void firstclass methoda int i,int j 這個簡單類有兩個方法 乙個過...

對隱藏層的簡單理解

本文 自 對隱藏層的簡單理解 在多級前饋網當中,隱藏層的定義是 除輸入層和輸出層以外的其他各層叫做隱藏層。隱藏層不直接接受外界的訊號,也不直接向外界傳送訊號。什麼是輸入層呢?和單級網路一樣,該層只起到輸入訊號的扇出作用.所以在計算網路的層數時不被記入。該層負責接收來自網路外部的資訊,被記作第0層。什...

c 隱藏理解

在物件導向的開發過程中,經常出現類的繼承,這裡面出現的成員函式的過載 overload 覆蓋 override 與隱藏 hidden 很容易混淆。首先澄清這3個概念 1.過載 1 發生在同類中 2 函式名相同 3 引數不同 4 可加可不加virtural關鍵字 2.重寫 覆蓋 1 發生在父類與子類中...