1. 程式人生 > >C++中過載,覆蓋,隱匿,函式多型

C++中過載,覆蓋,隱匿,函式多型

C++的多型特性是這門語言很重要的一個特性。

一、靜態多型:編譯器在編譯期間完成的,編譯器根據函式實參的型別(可能會進行隱式型別轉換),可推

斷出要呼叫那個函式,如果有對應的函式就呼叫該函式,否則出現編譯錯誤。

二、動態多型:在程式執行期間(非編譯期)判斷所引用物件的實際型別,根據其實際型別呼叫相應的方

法。

2.1 過載、覆蓋與隱藏的聯絡和區別

   2.1.1 成員函式被過載的特性:

      (1)相同的範圍(在同一個類中)

      (2)函式名字相同

      (3)引數不同

      (4)virtual 關鍵字可有可無

 2.1.2 成員函式被覆蓋

的特性:

      (1)不同的範圍(分別位於派生類與基類);

      (2)函式名字相同;

      (3)引數相同;

      (4)基類函式必須有 virtual 關鍵字。

2.1.3 成員函式被隱藏的特性:

      (1)如果派生類的函式與基類的函式同名,但是引數不同。此時,不論有無 virtual 關鍵字,基類的函式將被隱藏(注意別與過載混淆)。

      (2)如果派生類的函式與基類的函式同名,並且引數也相同,但是基類函式沒有 virtual 關鍵字。此時,基類的函式被隱藏(注意別與覆蓋混淆)。

      (3)引數相同;

     示例: (1)函式 Derived::f(float)覆蓋了 Base::f(float)。 (2)函式 Derived::g(int)隱藏了 Base::g(float),而不是過載。 (3)函式 Derived::h(float)隱藏了 Base::h(float),而不是覆蓋。

注意:隱藏很容易導致函式的引數被強轉為不想要的型別,從而導致編譯時出錯。

二、Overload 和override

Overload是過載的意思,Override是覆蓋的意思,也就是重寫。

過載Overload:在同一個類中,允許存在一個以上的同名函式,只要他們的引數個數或者引數型別不同即可。

例如:class CRabbit

{

CRabbit() {};

~virtual CAnimal(){};

void getRabbitNum(int rabbittype) Overload {};

void getRabbitNum(int rabbittype)Overload {};

}

覆蓋Override:用於覆蓋父類的方法,在子類中直接呼叫子類的方法。

例如:

class CAnniaml

{

CAnniaml() {};

~virtual CAnniaml(){};

void eat(int type)  {};

void sleep(int type) {};

}

class CRabbit  public :CAnniaml{

CRabbit() {};

~virtual CRabbit(){};

void eat(int type)  Override {};

void sleep(int type)Override  {};

void gethabbits(int type)

{

eat(type);//使用子類的eat函式

};

}