原文來自:http://blog.csdn.net/cai0538/article/details/7185454
1. 重載 (overload):
指函數名相同,但是它的參數表列個數或順序,類型不同。但是不能靠返回類型來判斷。函數重載存在於同一個類的定義中。
2. 重寫 (override):
父類與子類之間的多態性。子類重新定義父類中有相同名稱和參數的虛函數。
1) 被重寫的函數不能是 static 的。必須是 virtual 的 ( 即函數在最原始的基類中被聲明爲 virtual ) 。
2) 重寫函數必須有相同的類型,名稱和參數列表 (即相同的函數原型)
3) 重寫函數的訪問修飾符可以不同。儘管 virtual 是 private 的,派生類中重寫改寫爲 public,protected 也是可以的
3. 重定義 (redefining):
子類重新定義父類中有相同名稱的非虛函數 ( 參數列表可以不同 ) 。
重寫與重載的區別 (override) PK (overload)
1、方法的重寫是子類和父類之間的關係,是垂直關係;方法的重載是同一個類中方法之間的關 系,是水平關係。
2、重寫要求參數列表相同;重載要求參數列表不同。
3、重寫關係中,調用那個方法體,是根據對象的類型(對象對應存儲空間類型)來決定;重載關係,是根據調用時的實參表與形參表來選擇方法體的。
class Base
{
private:
virtual void display() { cout<<"Base display()"<<endl; }
void say(){ cout<<"Base say()"<<endl; }
public:
void f1(float a) { cout<<"Base f1(float)"<<endl; }
void f1(int a) { cout<<"Base f1(int)"<<endl; } //兩個函數f1爲函數重載
};
class DeriveA:public Base
{
public:
void display() { cout<<"DeriveA display()"<<endl; } //重寫函數display
void f1(int a,int b) { cout<<"DeriveA f1(int,int)"<<endl; } //重定義函數f1
};
注意:在 C++ 中若基類中有一個函數名被重載,在子類中重定義該函數,則基類的所有 版本將被隱藏——即子類只能用子類定義的,基類的不再可用。——名字隱藏特性。