#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關鍵字 隱藏是指派生類的函式...