重載和重定義

原文來自: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++ 中若基類中有一個函數名被重載,在子類中重定義該函數,則基類的所有 版本將被隱藏——即子類只能用子類定義的,基類的不再可用。——名字隱藏特性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章