1.重載
重載:同一作用域內被聲明的幾個具有不同參數列表(參數類型,個數,順序不同)的同名函數,根據參數列表確定調用哪個函數,重載不關心函數返回類型。
class A { public: void Swap(int* a, int* b); //overload int Swap(long* a, long* b); //overload void Swap(char* a, char* b); //overload void Swap(double* a, double* b); //overload };
2.重寫
重寫(覆蓋):是指派生類中存在重新定義的函數。其函數名,參數列表,都必須同基類中被重寫的函數一致,返回值類型除了協變情況下也必須和基類中被重寫的函數一致,只有函數體不同(花括號內)。派生類對象調用時會調用派生類的重寫函數,不會調用被重寫函數。基類中被重寫的函數必須有virtual修飾。協變情況:在C++中,只要原來的返回類型是基類類型的指針或引用,新的返回值類型是派生類的指針或引用,覆蓋的方法就可以改變返回類型,這樣的返回類型稱為協變返回類型。關於講解協變情況的鏈接:https://blog.csdn.net/sharp_up/article/details/53189414
// 3重寫了1 // 4重寫了2(協變情況) class A { public: virtual void Swap(int* a, int* b); //1 virtual A* get(char* str); //2 }; class B : public A { public: virtual void Swap(int* a, int* b); //3 virtual B* get(char* str); //4 };
3.隱藏
隱藏(重定義):是指派生類的函數屏蔽了與其同名的基類函數,注意只要同名函數並且基類沒有virtual修飾,不管參數列表是否相同,基類函數都會被隱藏。
//派生類中3隱藏了1 //派生類中4隱藏了2 class A { public: void Swap(int* a, int* b); //1 A* get(char* str); //2 }; class B : public A { public: void Swap(int* a, int* b); //3 B* get(char* str); //4 };
4. 總結
| 類別 | 作用域 | 函數名 | 參數列表 | 返回值類型 | 是否有virtual修飾 |
| 重載 | 同一作用域 | 相同 | 不同 | 無要求 | 無要求 |
| 重寫(覆蓋) | 不同作用域(父類和子類) | 相同 | 相同 | 相同(協變除外) | 父類函數必須有 |
| 隱藏(重定義) | 不同作用域(父類和子類) | 相同 | 無要求 | 無要求 | 父類函數不能有 |
