過載
(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關鍵是可有可無 函式名字相同 引數相同 引數個數和引數型別都...