c++重載,重寫,重定義的區別???

重載,重寫,重定義的解釋???


什麼叫做重寫??什麼叫做重載??
函數重載的條件是什麼?函數重寫的條件是什麼??
重載(overload):是函數名相同,參數列表不同,重載只是在類的內部存在。但是不能靠返回類型來判斷。
重寫(override):叫做覆蓋。子類重新定義父類中有相同名稱和參數的虛函數。函數特徵相同。但是具體實例不同,主要在繼承關係中實現。
重寫需要注意:
1.被重寫的函數不能是static的。必須是virtual的。
2.重寫函數必須有相同的類型。
3.重寫函數的訪問修飾符可以不同。儘管virtual 是private的,,派生類中可以重寫爲public,protected也可以的。

重定義:
子類重新定義父類中有相同名稱的非虛函數(參數列表可以不同)
如果一個類。存在和父類相同的方法,除非你在調用的時候,強制轉化爲父類類型,否則試圖對子類和父類做類似重載的調用是不能成功的。

綜上所述,總結如下:
1.成員函數重載的特徵
a.相同的範圍(同一個類中)、
b函數名字相同
c 參數不同
d.virtual關鍵字可有可無

2.重寫(覆蓋)是指派生類函數覆蓋基類函數,特徵是:
a.不同的範圍,分別位於基類和派生類中
b.函數的名字相同
c.參數相同
d.基類函數必須有virtual關鍵字
3.重定義(隱藏)是指派生類的函數屏蔽了與其同名的基類函數,規則如下:
a.如果派生類的函數和基類的函數同名。但是參數不同,此時,不管有無virtual,基類的函數被隱藏。
b.如果派生類的函數與基類的函數同名,並且參數也相同,但是基類函數沒有virtual關鍵字,此時,基類的函數被隱藏。

#include <iostream>
using namespace std;

class  Base
{
  private:
    virtual void display(){cout<<"Base display()"<<endl;}
    void say(){cout<<"Base say()"<<endl;}       
  public:
    void exec(){display();say();};
    void f1(string a){cout<<"Base f1(string)"<<endl;}
    //overload,兩個f1函數在Base類的內部被重載
    void f1(int a){cout<<"Base f1(int)"<<endl;}

};

class DeriveA:public Base
{
  public:
  //override.基類中display爲虛函數,故此處爲重寫

    void display(){cout<<"DeriveA display()"<<endl;}
  //redefing.f1函數在Base類中不爲虛函數,故此處爲重定義
    void f1(int a,int b){cout<<"DeriveA f1(int,int)"<<endl;}    
    void say(){cout<<"DeriveA say()"<<endl;}//redefing.同上



};

class DeriveB:public Base
{

 public:
  void f1(int a){cout<<"DeriveB f1(int)"<<endl;}//dedefining,重定義


};



int main(int argc,char *argv[])
{

DeriveA a;
Base *b = &a;
b->exec();//display():
//b裏面的函數display被類A覆蓋,但是say還是自己的

a.exec();//same result as last statement //a.本身就能調用到自己的實現
a.say();

DeriveB c;
c.f1(1);//version of DriveB called



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