C++中,函數重載描述的是同一個類中不同成員函數之間的關系;函數重寫是子類和基類之間不同成員函數之間的關系。
1、函數重載
在相同作用域中存在多個同名的函數,這些函數的參數表不同,編譯器根據函數不同的形參表對同名函數的名稱做修飾,然后這些同名函數就成了不同的函數。
特點:
- 函數重載必須在同一個類或同一個命名空間中進行;
- 子類無法重載父類函數,父類同名函數將被覆蓋;
- 重載是在編譯器期間根據參數類型和個數決定調用哪個函數。
函數重載的代碼示例:
void Test(int a);
void Test(double a);
void Test(int a, int b);
void Test(double a, int b);
注意:如果僅僅是函數的返回值不同,是沒辦法重載的。
2、函數重寫
子類重寫從基類繼承過來的函數,子類的函數名、返回值、參數列表都必須和基類相同。
特點:
- 函數重寫必須發生在父類與子類之間;
- 父類與子類的函數原型完全一樣;
- 使用virtual聲明之后能夠產生多態(若不寫virtual關鍵字,則稱為重定義),多態是在運行期間根據具體對象的類型來決定調用哪個函數。
函數重寫和多態的代碼示例:
#include <IOStream>
using namespace std;
class base {
public:
void Display1() {}
virtual void Display2() {}
};class derived : public base {
public:
void Display1() {} // 函數重寫
virtual void Display2() {} // 虛函數實現多態
};