1.重載:重載從overload翻譯過來,是指同一可訪問區內被聲明的幾個具有不同參數列(參數的類型,個數,順序不同)的同名函數,根據參數列表確定調用哪個函數,重載不關心函數返回類型。
示例代碼如下:
1 2 3 4 5 6 7 8 |
|
前四個互為重載函數,最后一個和第一個不是重載函數。
2.隱藏:隱藏是指派生類的函數屏蔽了與其同名的基類函數。注意只要同名函數,不管參數列表是否相同,基類函數都會被隱藏。
#include<iostream>
using namespace std;
class A {
public:void fun1(int i, int j) { cout << "A::fun1() : " << i << " " << j << endl; }
};class B : public A {
public://隱藏void fun1(double i) { cout << "B::fun1() : " << i << endl;}
};int main()
{B b;b.fun1(5); //調用B類中的函數b.fun1(1, 2); //出錯,因為基類函數被隱藏return 0;
}
3.重寫:重寫翻譯自override,也翻譯成覆蓋(更好一點),是指派生類中存在重新定義的函數。其函數名,參數列表,返回值類型,所有都必須同基類中被重寫的函數一致。只有函數體不同(花括號內),派生類調用時會調用派生類的重寫函數,不會調用被重寫函數。重寫的基類中被重寫的函數必須有virtual修飾。
實例代碼如下:
#include<iostream>
using namespace std;
class A {
public:virtual void fun3(int i) { cout << "A::fun3() : " << i << endl; }};
class B : public A {
public://重寫virtual void fun3(double i) { cout << "B::fun3() : " << i << endl; }
};
int main()
{A a;B b;A* pa = &a;pa->fun3(3);pa = &b;pa->fun3(5);return 0;
}
重載和重寫的區別:
- 范圍區別:重寫和被重寫的函數在不同的類中,重載和被重載的函數在同一類中。
- 參數區別:重寫與被重寫的函數參數列表一定相同,重載和被重載的函數參數列表一定不同。
- virtual的區別:重寫的基類必須要有virtual修飾,重載函數和被重載函數可以被virtual修飾,也可以沒有。
隱藏和重寫,重載的區別:
- 與重載范圍不同:隱藏函數和被隱藏函數在不同類中。
- 參數的區別:隱藏函數和被隱藏函數參數列表可以相同,也可以不同,但函數名一定同;當參數不同時,無論基類中的函數是否被virtual修飾,基類函數都是被隱藏,而不是被重寫。
?
參考資料
1.?C++中重載、重寫(覆蓋)和隱藏的區別實例分析