過載 覆蓋 隱藏

2022-06-02 13:33:12 字數 3811 閱讀 1424

過載

(1)過載是指在同乙個類內被宣告的幾個具有不同引數列的同名函式。

函式名必須相同,不考慮函式的返回值型別。

(2)示例**如下:

1 #include 2

using

namespace

std;34

class

sample511

void func(char ch, int a) //

過載1:引數順序不同

1215

void func(int a) //

過載2:引數個數不同

1619

void func(int a, double db) //

過載3:引數型別不同

2023

void func(int a, char ch) const

//過載4:常函式(被const修飾的函式)

2427

/*28

int func(int a, char ch) // error! 非過載,編譯無法通過。因為編譯器認為是重定義。

2933

*/34

};35

36void

main()

3745

46//

執行結果:

47/*

48a 10 ch a

49ch a a 20

50a 30

51a 40 db 12.34

52請按任意鍵繼續. . .

53*/

分析總結:

<1> 在同乙個類中(同一作用域中)。

<2> 方法名相同。

<3> 引數個數、引數型別或者引數順序不同。

<4> 與函式的返回值型別無關。

如果僅僅返回值型別不同,那麼對編譯器來說會在呼叫時產生二義性。

所以,拋開返回值型別再分析即相當於重定義,重定義是被禁止的(乙個函式只允許有乙份函式體)。

<5> const修飾。類中成員函式,const 用在函式後一般修飾的是this指標。所以,也算過載的範疇。

覆蓋(1)覆蓋也叫重寫,是指在派生類中重寫基類某虛函式的實現體的一種形式。

函式名、引數列表、返回值型別都必須同基類被重寫的虛函式的嚴格一致。

僅僅只是函式實現體不同。即達到嚴格的覆蓋目的。

(2)示例**如下:

1 #include 2

using

namespace

std;34

class

sample511

};12

13class test : public

sample

1420

};21

22void

main()

2330

/*run out:

31test::func

32請按任意鍵繼續. . .

33*/

分析總結:

<1> 不同的範圍(分別位於基類和派生類,不同作用域中)。

<2> 方法名相同。

<3> 引數嚴格一致。

<4> 返回型別相同。

<5> 基類函式前必須要加關鍵字virtual,即必須是虛函式。

隱藏(1)隱藏是指在派生類中隱藏基類的同名函式。

與過載範圍不同,隱藏函式和被隱藏函式不在同乙個類中。

與覆蓋條件不同,隱藏函式和被隱藏函式的引數可以相同,也可以不同,但是函式名必須要相同。

重要備註:

<1> 當引數相同時,如果基類中的函式被virtual修飾,基類的函式就是所謂被覆蓋。

<2> 當引數相同時,如果基類中的函式沒有被virtual修飾,基類的函式就是所謂被隱藏。

<3> 當引數不相同時,無論基類中的函式是否被virtua修飾,基類的函式都是所謂的被隱藏。

(2)示例**如下:

1 #include 2

using

namespace

std;34

class

sample511

12virtual

void

func1()

1316

17void func2(int

a)18

2122

void func3(const

char *db)

2326

27void func4(int n, int

m)28

31};

3233

class test : public

sample

3441

//隱藏1

42void func1(int a) //

帶virtual關鍵字,引數不同

4346

47#if 0

48int func1() //

帶virtual關鍵字,引數相同,但返回值不同

4953

//-- e0317 返回型別與重寫虛函式 "sample::func1" 的返回型別 "void" 既不相同,也不協變

54#endif

5556

//隱藏2

57void func2(int a) //

不帶virtual,引數相同,返回值相同

5861

62#if 0

63int func2(int a) //

不帶virtual,引數相同,但返回值不同

6468

//-- e0311 無法過載僅按返回型別區分的函式

69#endif

7071

//隱藏3

72void func3(int a) //

不帶virtual,引數不同,返回值相同

7376

//隱藏4

77int func4(double dn, double dm) //

不帶virtual,引數不同, 返回值不同

7882

};83

84int

main()

85121

//run out:

122/*

123test::func0

124test::func1

125test::func2

126test::func3

127test::func4

128129

test::func0

130sample::func1

131sample::func2

132sample::func3

133sample::func4

134135

test::func0

136test::func2

137test::func4

138請按任意鍵繼續. . .

139*/

分析總結:

<1> 不同的範圍(分別位於基類和派生類,不同作用域)。

<2> 方法名相同。

<3> 有關鍵字virtual,必須要引數不同。

<4> 無關鍵字virtual,引數任意。

總結三者的關係,總結為一張圖:

順序 選擇 迴圈 總結

過載 覆蓋 隱藏

學習c 些許時間了,隨便寫點東西吧。過載 覆蓋 隱藏 1.過載 相同作用域,函式名相同,引數不同,virtual關鍵字可有可無。2.覆蓋 不同作用域,函式名相同,引數相同,有virtual關鍵字。3.隱藏 一般是父類和子類之間,函式名相同,引數不同時,不管有沒有virtual關鍵字都會導致隱藏。函式...

覆蓋,隱藏,過載

1.過載 覆蓋與隱藏 1 過載 成員函式具有以下的特徵時發生 過載 a 相同的範圍 同乙個類中 b 函式的名字相同 c 引數型別不同 不能進行隱式型別轉換 d virtual關鍵字可有可無 2 覆蓋 也叫 繼承 指派生類函式覆蓋基類函式,特徵是 a 不同的範圍 分別位於基類與派生類中 b 函式名字相...

覆蓋,過載,隱藏

覆蓋 重寫 過載,隱藏這三者的概念很容易混淆,弄清楚這三者的區別與聯絡是有必要的.覆蓋 重寫 override,過載 overload,多型 polymorphis函式名字相同 引數不相同 引數個數或引數型別不同 相同作用域 virtual關鍵是可有可無 函式名字相同 引數相同 引數個數和引數型別都...