C++ 中函式過載和函式覆蓋的區別
在面向物件程式設計中,多型性有兩個重要的概念,即函式過載和函式覆蓋。
當兩個或多個函式具有相同的名稱但引數不同時,稱為函式過載。
另一方面,函式覆蓋是指提供一種機制,可以在繼承類中重新定義具有相同名稱和簽名的函式。
閱讀本文以瞭解更多關於 C++ 中函式過載和覆蓋的資訊,以及它們之間如何區別。
什麼是函式過載?
在一個類中定義多個同名但引數不同的函式的概念稱為函式過載。函式過載發生在編譯時。因此,它也稱為編譯時多型性。函式過載發生在沒有繼承的情況下。
例如,考慮兩個函式add(float a, float b)和add(int a, int b)。這裡,這兩個函式具有相同的名稱,但引數型別不同。
什麼是函式覆蓋?
函式覆蓋是指允許兩個類具有相同名稱的函式的概念。函式覆蓋是透過使用繼承和虛擬函式來實現的。
眾所周知,每個派生類都繼承其基類的所有函式,在這種情況下,派生類中的所有成員函式都覆蓋了基類中的成員函式,因此這被稱為函式覆蓋。函式覆蓋是在執行時實現的,因此它也稱為執行時多型性。
函式過載和函式覆蓋的區別
以下是 C++ 中函式過載和覆蓋的重要區別。
序號 |
函式過載 |
函式覆蓋 |
---|---|---|
1. |
可以透過定義兩個或多個具有相同名稱但引數數量和型別不同的函式來實現函式過載。 |
可以透過在父類和子類中定義具有相同返回型別和引數的函式來實現函式覆蓋。 |
2. |
可以在沒有繼承的情況下發生。 |
只有當一個類繼承自另一個類時才能發生。 |
3. |
發生在編譯時。 |
發生在執行時。 |
4. |
也稱為編譯時多型性。 |
也稱為執行時多型性。 |
5. |
函式過載可以多次發生。 |
函式覆蓋只能在派生類中發生一次。 |
6. |
這裡,過載函式的作用域保持不變。 |
這裡,覆蓋函式的作用域不同。 |
7. |
函式過載期間不使用任何關鍵字。 |
在主類中定義函式時,前面會加上“virtual”關鍵字。 |
8. |
函式將使用相同的名稱、不同的引數數量或型別重新定義。 |
使用“override”關鍵字在派生類中重新定義相同的函式。 |
9. |
解構函式不能過載。 |
解構函式可以覆蓋。 |
10. |
可用於實現早期繫結。 |
覆蓋也稱為後期繫結。 |
結論
這兩個概念之間最顯著的區別在於,函式過載不使用繼承,而函式覆蓋是在繼承的幫助下實現的。