C++之重載覆蓋和隱藏

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

  • 重載
  1. 在同一做用域內
  2. 函數名相同,參數列表不一樣(分三種狀況:參數個數不一樣,參數類型不一樣,參數個數和類型都不一樣)
  3. 返回值類型能夠相同也能夠不一樣
  • 重寫(覆蓋)
  1. 在不一樣做用域內,分別在父類和子類
  2. 函數名相同,參數列表相同,返回值類型相同,協變除外(下面會介紹什麼是協變)
  3. 基類函數必須有virtual關鍵字修飾
  4. 父子類中函數的訪問修飾符能夠不一樣
  • 重定義(隱藏)
  1. 在不一樣的做用域內,分別是父類和子類
  2. 函數名相同
  3. 在基類和派生類中只要不構成重寫的都是重定義

重載spa

C++中函數重載達到的效果:指針

調用函數名相同的函數,根據實參的類型和個數選擇相應的實現函數體執行。對象

函數重載是一種靜態多態,或者稱之爲靜態聯編、靜態綁定、靜態決議,其實都同樣。繼承

重寫/覆蓋作用域

在子類中定義一個與父類中徹底相同的虛函數:變量

  1. 父類和子類中的虛函數,函數名、參數個數、參數類型以及返回值類型都相同,構成重寫。
  2. 子類中的虛函數與父類中的虛函數,函數名、參數個數和類型都相同,只是返回值不一樣,父類的虛函數返回父類的指針或引用,子類虛函數返回子類的指針或引用,這種狀況下也構成重寫,咱們稱之爲協變

C++中函數重寫達到的效果:引用

在子類中重寫了父類的虛函數,則子類對象調用該重寫函數時從子類內部調用,而不是從父類繼承,是一種動態多態。vi

在子類中重寫了父類的虛函數,若是用一個父類指針或引用指向子類對象,那麼該指針調用的是重寫的虛函數,也便是子類的虛函數, 而若是一個父類指針指向父類對象,則調用父類的虛函數。co

重定義/隱藏

指的是在不一樣做用域內,函數名相同,但不構成重寫的則構成重定義。不單單是值類的成員函數,也能夠是類的成員變量。

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

若是再父類和子類中有相同名字的成員,子類中會將父類成員隱藏,此時不管在子類內部仍是外部,經過子類成員會對象訪問該成員,訪問到的都是子類同名成員。

若是再子類內部或外部經過子類成員訪問同名成員函數,則須要根據函數調用的規則來調用子類的同名成員函數,不然調用失敗。

相關文章
相關標籤/搜索