C 中覆蓋,過載和隱藏

2021-06-19 12:45:13 字數 1835 閱讀 9210

#include

using namespace std;

struct foo

void func(int x) };

那麼,如果不用 using 宣告,拆分後**中的函式 func 不是過載應該是什麼呢?是隱藏(hide)。下面是關於過載、覆蓋和隱藏的區別: 這幾個概念都有乙個共同點:函式名稱相同,所以不免讓人混淆,大致的區別如下: 過載

(overload):

必須在乙個域中

,函式名稱相同但是函式引數不同

,過載的作用就是同乙個函式有不同的行為

,因此不是在乙個域中的函式是無法構成過載的

,這個是過載的重要特徵

覆蓋(override):

覆蓋指的是派生類的虛函式覆蓋了基類的同名且引數相同的函式

,既然是和虛函式掛鉤

,說明了這個是乙個多型支援的特性

,所謂的覆蓋指的是用基類物件的指標

或者引用時訪問虛函式的時候會根據實際的型別決定所呼叫的函式

,因此此時派生類的成員函式可以"覆蓋

"掉基類的成員函式

. 注意唯有同名且引數相同還有帶有

virtual

關鍵字並且分別在派生類和基類的函式才能構成虛函式

,這個也是派生類的重要特徵

. 而且

,由於是和多型掛鉤的

,所以只有在使用類物件指標或者引用的時候才能使用上

. 總之一句話

:覆蓋函式都是虛函式

,反之不然

~~ (

如果基類和繼承類的函式名稱,產生返回值都是一樣的

[如果返回值不同應該無法編譯

],如果基類用到了

virtual

,那麼無論繼承類的實現中是否加入

virtual

這個keyword

,還是會構成

override

的關係)

隱藏(hide):

指的是派生類的成員函式隱藏了基類函式的成員函式

.隱藏一詞可以這麼理解

:在呼叫乙個類的成員函式的時候

,編譯器會沿著類的繼承鏈逐級的向上查詢函式的定義,

如果找到了那麼就停止查詢了

,所以如果乙個派生類和乙個基類都有同乙個同名

(暫且不論引數是否相同

)的函式

,而編譯器最終選擇了在派生類中的函式,那

麼我們就說這個派生類的成員函式"隱藏

"了基類的成員函式

,也就是說它阻止了編譯器繼續向上查詢函式的定義

....

回到隱藏的定義中

,前面已經說了有

virtual

關鍵字並且分別位於派生類和基類的同名

,同引數函式構成覆蓋的關係

,因此隱藏的關係只有如下的可能

: 1)

必須分別位於派生類和基類中

2)必須同名

3)引數不同的時候本身已經不構成覆蓋關係了

,所以此時是否是

virtual

函式已經不重要了

當引數相同的時候就要看時候有

virtual

關鍵字了

,有的話就是覆蓋關係

,沒有的時候就是隱藏關係了

很多人分辨不清隱藏和覆蓋的區別

,因為他們都是發生在基類和派生類之中的

.但是它們之間最為重要的區別就是

: 覆蓋的函式是多型的

,是存在於

vtbl

之中的函式才能構成"覆蓋

"的關係

,而隱藏的函式都是一般的函式

,不支援多型

,在編譯階段就已經確定下來了

.

C 過載 覆蓋 和隱藏

這幾個概念都有乙個共同點 函式名稱相同,所以不免讓人混淆,大致的區別如下 過載 overload 必須在乙個域中,函式名稱相同但是函式引數不同,過載的作用就是同乙個函式有不同的行為,因此不是在乙個域中的函式是無法構成過載的,這個是過載的重要特徵 覆蓋 override 覆蓋指的是派生類的虛函式覆蓋了...

C 過載 覆蓋和隱藏

過載 覆蓋和隱藏 共同點 函式名稱相同。1 過載 必須在乙個域內,函式名稱相同但是函式引數不同。過載的作用就是同乙個函式有不同的行為。過載完全是乙個編譯時 或靜態 的概念。如果宣告了同名函式,編譯器會在編譯時處理這些同名函式的呼叫問題,確定呼叫哪乙個函式,執行時不 涉及呼叫過載函式的額外開銷或決定。...

c 過載 覆蓋和隱藏

成員函式過載的特徵 1 相同的範圍 在同乙個類中 2 函式名字相同 3 引數不同 4 virtual關鍵字可有可無 函式覆蓋指的是派生類函式覆蓋基類函式,1 要求不同的範圍 分別位於派生類與基類中 2 函式名字要求相同 3 引數要求相同 4 基類和拿書必須有virtual關鍵字 隱藏是指派生類的函式...