這三個詞分別描述了函數(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é)果如下:

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)烈建議大家使用。