類成員函式的過載 覆蓋和隱藏區別

2021-08-18 08:38:54 字數 1548 閱讀 1541

1.過載是指允許存在多個同名函式,而這些函式的參數列不同(或許引數個數不同,或許引數型別不同,或許兩者都不同)。實現原理上:編譯器根據函式不同的參數列,對同名函式的名稱做修飾,然後這些同名函式就成了不同的函式(至少對於編譯器來說是這樣的)。如,有兩個同名函式:function func(p:integer):integer;和function func(p:string):integer;。那麼編譯器做過修飾後的函式名稱可能是這樣的:int_func、str_func。對於這兩個函式的呼叫,在編譯器間就已經確定了,是靜態的。也就是說,它們的位址在編譯期就繫結了(早繫結),因此,過載和多型無關!

特徵

(1)相同的範圍(在同乙個類中);

(2)函式名字相同;

(3)引數不同;

(4)virtual 關鍵字可有可無。

class a;

前四個為過載函式,最後乙個不是

2.覆蓋(重寫)是指派生類函式覆蓋基類函式(是指子類重新定義父類虛函式的方法。)。 實現原理:和多型真正相關。當子類重新定義了父類的虛函式後,父類指標根據賦給它的不同的子類指標,動態的呼叫屬於子類的該函式,這樣的函式呼叫在編譯期間是無法確定的(呼叫的子類的虛函式的位址無法給出)。因此,這樣的函式位址是在執行期繫結的(晚繫結)。

特徵

(1)不同的範圍(分別位於派生類與基類);

(2)函式名字相同;

(3)引數相同;

(4)基類函式必須有virtual 關鍵字。

#include

using namespace std;

class a

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

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

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

#include

using namespace std;

class a

};class b :public a

};int main(void)

輸出為1 3 1

隱藏和重寫,過載的區別:

#include

using namespace std;

class a

void test1(int i)

virtual void test2(int i)

};class b : public a

//重寫

void test2(int i)

//隱藏

void test2(double i)

};int main()

輸出結果為:

b::test2(int) : 3

b::test2(int) : 10

b::test2(int) : 20

類成員函式的過載 覆蓋和隱藏區別

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

類成員函式的過載 覆蓋和隱藏區別

成員函式被過載的特徵 1 相同的範圍 在同乙個類中 2 函式名字相同 3 引數不同 4 virtual 關鍵字可有可無。覆蓋是指派生類函式覆蓋基類函式,特徵是 1 不同的範圍 分別位於派生類與基類 2 函式名字相同 3 引數相同 4 基類函式必須有virtual 關鍵字。當派生類物件呼叫子類中該同名...

類成員函式的過載 覆蓋和隱藏區別?

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