📚 重載(Overloading)、覆蓋(Overriding)、重定義(Hiding)是面向對象編程中常見的概念,它們分別用于描述不同情況下函數或方法的行為。
目錄
重載(Overloading)
覆蓋(Overriding)
重定義(Hiding)
總結
重載(Overloading)
? ? 重載指的是在同一個作用域內,可以定義多個同名的函數或方法,但它們的參數列表必須不同(包括參數類型、個數或順序)。編譯器會根據調用時提供的參數類型和個數來決定調用哪個具體的函數。
🎃 使用場景:
當需要為同一操作提供多種參數類型支持時,可以使用函數重載。例如,一個打印函數可以接受整數、浮點數、字符串等不同類型的參數。
提供默認參數值也是函數重載的一種形式,這樣可以簡化函數的調用。
class Example {
public:void print(int num) {// 打印一個整數}void print(double num) {// 打印一個雙精度浮點數}
};int main() {Example obj;obj.print(10); // 調用 void print(int num)obj.print(3.14); // 調用 void print(double num)return 0;
}
? 在Example
類中定義了兩個名為 print
的方法,一個接受整數參數,另一個接受雙精度浮點數參數。它們之間的區別在于參數的類型。
覆蓋(Overriding)
? ? ?覆蓋指的是派生類重寫(override)基類的虛函數。只有虛函數才能被派生類覆蓋。通過覆蓋,派生類可以提供自己特定的實現,而不使用基類的實現。
🎃 使用場景:
當基類定義了一個虛函數,而派生類需要根據自身的邏輯重新實現這個函數時,使用覆蓋。
通過基類指針或引用調用虛函數時,實際執行派生類中的版本,實現運行時多態。
class Base {
public:virtual void display() {cout << "Base class display function" << endl;}
};class Derived : public Base {
public:void display() override {cout << "Derived class display function" << endl;}
};
? Derived
類覆蓋了 Base
類中的 display
函數。當通過基類指針或引用調用 display
函數時,實際執行的是派生類 Derived
中的實現。
重定義(Hiding)
? ? ?重定義是指在派生類中定義了與基類同名但參數列表不同的函數。在這種情況下,派生類的函數會隱藏基類中的同名函數。這種情況下,基類中的同名函數變得不可見,即使使用基類指針或引用也無法訪問到它。
🎃 使用場景:
當派生類需要定義一個與基類同名但參數不同的函數時,這個新函數會隱藏基類中的同名函數。
使用重定義時需要小心,因為基類的同名函數會被派生類的函數遮蔽,可能導致意外的調用行為。
class Base {
public:void display() {cout << "Base class display function" << endl;}
};class Derived : public Base {
public:void display(int num) {cout << "Derived class display function with integer: " << num << endl;}
};
? Derived
類定義了一個名為 display
的函數,帶有一個整數參數。它重定義了 Base
類中的 display
函數。如果我們嘗試通過基類指針或引用調用 display
,編譯器將會報錯,因為沒有與指定參數列表匹配的基類函數。
總結
重載:同一作用域內多個函數名相同但參數列表不同。
覆蓋:派生類重寫基類的虛函數,提供特定實現。
重定義:派生類中定義了與基類同名但參數列表不同的函數,導致基類函數不可見。