C++ override overload overwrite

這三個詞分別描述了函數(shù)間的三種關(guān)系,要分清楚這三種關(guān)系,我們先來看一段代碼示例:

#include <iostream>

class Base{
public:
  void overload_func(){
    std::cout<<"overload func without argumnet."<<std::endl;
  }
  
  void overload_func(int arg){
    std::cout<<"overload func with with int argumnet "<<arg<<std::endl;
  }
  
  virtual void override_func(){
    std::cout<<"override func Base"<<std::endl;
  }
  
  void overwrite_func(){
    std::cout<<"over write func Base"<<std::endl;
  }
};

class Derived:public Base{
public:
  virtual void override_func(){
    std::cout<<"override func Derived"<<std::endl;
  }
  
  void overwrite_func(){
    std::cout<<"over write func Derived"<<std::endl;
  }
};

int main()
{
  Base base;
  base.overload_func();
  base.overload_func(1);

  Base *pBase = new Base;
  pBase->override_func();
  pBase->overwrite_func();

  pBase = new Derived;
  pBase->override_func();
  pBase->overwrite_func();

  Derived derived;
  derived.overwrite_func();

  return 0;
}

上述代碼的運行結(jié)果如下:


image.png

overload

先來說一下第一種關(guān)系,overload。下面的兩個函數(shù)間的關(guān)系為overload:

void overload_func(){
  std::cout<<"overload func without argumnet."<<std::endl;
 }
  
void overload_func(int arg){
  std::cout<<"overload func with with int argumnet "<<arg<<std::endl;
}

它們的區(qū)別在于參數(shù)是不一樣的。同一個域內(nèi)的同名函數(shù),但是參數(shù)數(shù)量和參數(shù)類型是不一樣的,這樣的函數(shù)間的關(guān)系是overload。
這里需要說明的一點是,有const修飾的函數(shù)和沒有const修飾的同名函數(shù),也應(yīng)該屬于overload。
當(dāng)編譯器編譯到overload函數(shù)時,它會根據(jù)函數(shù)的參數(shù)數(shù)量和參數(shù)類型找到合適的函數(shù)。由于不是每一個函數(shù)調(diào)用時都會使用到返回值,所以編譯器在尋找適當(dāng)?shù)暮瘮?shù)時,無法使用返回值的類型信息,這也是為啥返回值類型不用于區(qū)分overload函數(shù)。而不在同一個域內(nèi)的同名函數(shù),調(diào)用的時候會使用:: 操作符,這樣就能直接匹配到對應(yīng)的函數(shù),不需要通過參數(shù)類型和參數(shù)數(shù)量來進(jìn)行匹配。
函數(shù)重載意味著兩個不同功能的函數(shù)使用著同樣的名字。如果函數(shù)的區(qū)別沒有小到只通過參數(shù)的類型和數(shù)量就能區(qū)分的話,我個人認(rèn)為不應(yīng)該使用函數(shù)重載,這樣不是一個好的習(xí)慣。

override 和 overwrite

override和overwrite 應(yīng)用在類的繼承體系中,簡單的來說就是我們在子類中實現(xiàn)了一個函數(shù),該函數(shù)的原型同父類中的某個函數(shù)完全一致。這樣,子類的函數(shù)就會將父類中的函數(shù)覆蓋掉。
細(xì)心的同學(xué)會發(fā)現(xiàn),我們對override_func函數(shù)增加了virtual 指示符,而overwrite_func卻沒有。這樣導(dǎo)致的結(jié)果就是override可以使用多態(tài),可以動態(tài)的找到合適的函數(shù),而overwrite_func卻沒有多態(tài)性質(zhì)。
也就是說,在子類中,可以使用多態(tài)的函數(shù)重寫可以理解為override,不能使用多態(tài)的函數(shù)重寫為overwrite。再簡單點就是,有沒有virtual指示符。
如果需要對父類中的函數(shù)進(jìn)行重寫,強(qiáng)烈建議添加virtual,不要overwrite。
C++ 11增加了override關(guān)鍵字,強(qiáng)烈建議大家使用。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容