C++ 中的函數覆蓋 [函數重載與示例覆蓋]

已發表: 2021-05-25

C++ 中的函數覆蓋是一個特性,它允許我們在子類中使用已經存在於其父類中的函數。 子類繼承所有數據成員,以及父類中存在的成員函數。 如果您希望覆蓋子類中的任何功能,則可以實現函數覆蓋。 函數覆蓋意味著在子類中創建父類函數的更新版本。

目錄

C++ 函數

C++ 函數是一組組合在一起執行任務的語句。 每個程序至少有一個 main() 函數,某些程序可以有附加函數。

函數聲明向編譯器傳達函數名稱、參數和返回類型。 函數定義決定了函數體。 C++ 標準庫由程序可以調用的許多內置函數組成。 函數可以是方法、過程或子例程。

定義函數

C++ 函數的一般語法是:

return_type function_name(參數列表) {

功能體

}

任何 C++ 函數都包含函數頭和函數體。 C++ 函數的組成部分是:

返回類型——返回類型表示函數返回值的類型。

函數名稱 -這表示函數的名稱。 函數名和參數列表組成了函數簽名。

參數 –參數是函數返回值的佔位符。 調用函數時,會將一個值傳遞給稱為實際參數的參數。

函數體- 函數體構成了定義函數將做什麼的語句列表。

調用函數

要在 C++ 中使用函數,您必須調用或調用該函數。 控制權轉移給函數,然後函數執行所需的任務,return 語句將控制權返回給主程序。

您需要傳遞所需的參數,包括函數名來調用函數。 如果函數返回一個值,則可以存儲該值。 有幾種方法可以在調用函數時將參數傳遞給函數。 調用類型有按值調用、按引用調用和按指針調用。

C++ 中的函數覆蓋

當派生類或子類定義了已在基類或父類中定義的函數時,在 C++ 中稱為函數覆蓋。 函數覆蓋幫助我們實現運行時多態性。 它使程序員能夠執行已在基類中使用的函數的特定實現。

例子:

資源

研究上面給出的例子。 這裡父類是“Base”,子類是“Derived”。

上述程序的輸出將是:

派生函數

在基類和派生類中都聲明了函數 print()。 當我們通過派生類對象“派生1”調用函數 print() 時,派生類的 print() 被調用並通過覆蓋基類的相同函數來執行。

函數覆蓋原則的工作

資源

從上圖中可以看出,Base 類函數被覆蓋,因為我們通過 Derived 類的對象調用了相同的函數。

如果我們通過 Base 類的對象調用 print() 函數,該函數不會被覆蓋。 例如:

//調用Base類的函數

基地基地1;

base1.print(); // 輸出:基本函數

上述代碼的輸出將是:

基本功能

如何在 C++ 中訪問被覆蓋的函數

您必須使用範圍解析運算符“::”來訪問被覆蓋的函數。 訪問重寫函數的另一種方法是使用基類的指針指向派生類的對象並通過指針調用函數。

例子:

資源

上述程序的輸出將是:

派生函數

基本功能

覆蓋函數訪問的工作

資源

這裡的語句 derived 1.print() 訪問 Derived 類的 print() 函數,而語句 derived2.Base::print() 訪問 Base 類的 print() 函數。

從派生類調用 C++ 重寫函數

在這段代碼中,我們從 Derived 類本身中調用被覆蓋的函數。

來自 Derived 類的重寫函數調用的工作

資源

Base::print() 命令從 Derived 類內部調用被覆蓋的函數。

從世界頂級大學在線學習軟件工程課程獲得行政 PG 課程、高級證書課程或碩士課程,以加快您的職業生涯。

函數重載與函數覆蓋

函數重載是在編譯時實現的,可以在基類和派生類中完成。 它有助於通過更改函數的簽名(例如參數的數據類型或返回類型)來提供函數的多種定義。

函數覆蓋是在運行時實現的。 在覆蓋中,基類在派生類中重新定義,具有相同的返回類型和參數。 C++ 中函數覆蓋和函數重載之間的其他區別是:

1. 繼承

函數重寫只能與類繼承一起使用,而函數重載不需要類繼承。

2. 函數簽名

重載函數的簽名在參數數量或參數類型上有所不同。 在函數覆蓋中,函數簽名保持不變。

三、功能範圍

重載函數的作用域不同,而重載函數的作用域相同。

4. 函數行為

當派生類函數的執行方式必須與基類函數不同或具有附加功能時,函數覆蓋是必不可少的。 當具有相同名稱的函數需要根據傳遞給它們的參數具有不同的行為時,就會實現函數重載。

如果您有興趣了解有關全棧軟件開發的更多信息,請查看 upGrad 和 IIIT-B 的全棧軟件開發執行 PG 計劃,該計劃專為工作專業人士設計,提供 500 多個小時的嚴格培訓、9 個以上的項目,和任務、IIIT-B 校友身份、實用的實踐頂點項目和頂級公司的工作協助。

什麼是函數覆蓋?

函數覆蓋是面向對象編程中的一個概念,它允許派生類中的函數覆蓋其基類中的函數,但具有不同的簽名(並且通常具有不同的實現)。 這方面的一個關鍵方面是派生類不可能“撤消”對基類的更改,或者至少在不進一步編輯基類的情況下是不可能的。 函數覆蓋的一個常見用途是在基類中提供默認實現,然後在派生類中使用特定實現進行覆蓋。

函數重載和重載有什麼區別?

當您創建與基類中已存在的函數同名的函數時,會發生函數覆蓋。 發生這種情況時,新功能將替換現有功能,並可以代替原來的功能使用。 當您創建具有相同名稱但參數不同的函數時,會發生重載。 發生這種情況時,除了原始函數之外,還將調用新函數,並且這兩個函數都可以在任何上下文中使用而沒有任何問題。

C++中的繼承是什麼?