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函式
};
}