C 之過載覆蓋和隱藏

2022-02-25 03:40:48 字數 1175 閱讀 5774

繼承體系下同名成員函式的三種關係

在同一作用域內

函式名相同,引數列表不同(分三種情況:引數個數不同,引數型別不同,引數個數和型別都不同)

返回值型別可以相同也可以不同

在不同作用域內,分別在父類和子類

函式名相同,引數列表相同,返回值型別相同,協變除外(下面會介紹什麼是協變)

基類函式必須有virtual關鍵字修飾

父子類中函式的訪問修飾符可以不同

在不同的作用域內,分別是父類和子類

函式名相同

在基類和派生類中只要不構成重寫的都是重定義

過載

c++中函式過載達到的效果:

呼叫函式名相同的函式,根據實參的型別和個數選擇相應的實現函式體執行。

函式過載是一種靜態多型,或者稱之為靜態聯編、靜態繫結、靜態決議,其實都一樣。

重寫/覆蓋

在子類中定義乙個與父類中完全相同的虛函式:

父類和子類中的虛函式,函式名、引數個數、引數型別以及返回值型別都相同,構成重寫。

子類中的虛函式與父類中的虛函式,函式名、引數個數和型別都相同,只是返回值不同,父類的虛函式返回父類的指標或引用,子類虛函式返回子類的指標或引用,這種情況下也構成重寫,我們稱之為協變

c++中函式重寫達到的效果:

在子類中重寫了父類的虛函式,則子類物件呼叫該重寫函式時從子類內部呼叫,而不是從父類繼承,是一種動態多型。

在子類中重寫了父類的虛函式,如果用乙個父類指標或引用指向子類物件,那麼該指標呼叫的是重寫的虛函式,也即是子類的虛函式, 而如果乙個父類指標指向父類物件,則呼叫父類的虛函式。

重定義/隱藏

指的是在不同作用域內,函式名相同,但不構成重寫的則構成重定義。不僅僅是指類的成員函式,也可以是類的成員變數。

c++中重定義達到的效果:

對於在父類和子類中有相同名字的成員,子類會將父類成員隱藏,此時無論在子類內部還是外部,通過子類成員物件訪問該成員,訪問到的都是子類同名成員。

如果在子類內部或外部通過子類成員訪問同名成員函式,則需要根據函式呼叫的規則來呼叫子類的同名成員函式,否則呼叫失敗。

C 過載 覆蓋 和隱藏

這幾個概念都有乙個共同點 函式名稱相同,所以不免讓人混淆,大致的區別如下 過載 overload 必須在乙個域中,函式名稱相同但是函式引數不同,過載的作用就是同乙個函式有不同的行為,因此不是在乙個域中的函式是無法構成過載的,這個是過載的重要特徵 覆蓋 override 覆蓋指的是派生類的虛函式覆蓋了...

C 過載 覆蓋和隱藏

過載 覆蓋和隱藏 共同點 函式名稱相同。1 過載 必須在乙個域內,函式名稱相同但是函式引數不同。過載的作用就是同乙個函式有不同的行為。過載完全是乙個編譯時 或靜態 的概念。如果宣告了同名函式,編譯器會在編譯時處理這些同名函式的呼叫問題,確定呼叫哪乙個函式,執行時不 涉及呼叫過載函式的額外開銷或決定。...

c 過載 覆蓋和隱藏

成員函式過載的特徵 1 相同的範圍 在同乙個類中 2 函式名字相同 3 引數不同 4 virtual關鍵字可有可無 函式覆蓋指的是派生類函式覆蓋基類函式,1 要求不同的範圍 分別位於派生類與基類中 2 函式名字要求相同 3 引數要求相同 4 基類和拿書必須有virtual關鍵字 隱藏是指派生類的函式...