有關C++類中的重載,覆蓋與隱藏

在過程式編程中,咱們經常用到重載,重載的好處顯而易見,可讓咱們以一個名字去定義某一類操做(對不一樣的各類輸入),其實在面向對象的類中,重載依然發揮這樣的好處。編程

例如以下代碼: class base { public: void checknum(int n){cout<<"this is a int num";} void checknum(float n){cout<<"this is a float num";}
}函數

int main() { int i = 5; float j = 5.6; base a; a.checknum(i); a.checknum(j); }this

當上述代碼執行完畢,結果最終爲 "this is a int num" "this is a float num"指針

注意:重載只在同一個類中產生效果,在同一類中定義某一種操做,屬於編譯器福利,重載成立的條件: 在同一個類中、函數名字相同、函數參數列表不一樣(或是參數類型不一樣,或是參數個數不一樣)。另外還有注意一點,函數返回類型不構成重載,就好像:code

int check(int a){} float check(int a){}對象

這樣的兩個函數是不構成重載的。繼承

重載說完,咱們說說覆蓋的事,在面向對象的過程當中,類(即對某個對象特性的描述)是能夠被繼承的,就像編譯器

卡車是汽車的一種,繼承了汽車的特性,然而派生類也有本身的特色,不然咱們還用派生類做甚?(咱們用轎io

車拉貨就行了,用卡車幹甚?)由於拉貨的屬性是卡車所獨有的,而對於特有的屬性,須要有特有的操做,不編譯

過這種操做每每只是通用狀況的特例,(不管拉貨仍是拉人,都只是拉這個操做的特例)因此咱們經常要對派

生類中的操做從新定義以適應當前的狀況,這個時候,就用獲得覆蓋了。

覆蓋,顧名思義,是對基類操做的覆蓋。

例如以下代碼:

class base
{
public:
virtual void check(int i){cout<<"this is base function";}
};

class derive :public base
{
public:
void check(int i){cout<<"this is derive function";}
};

當使用專門的對象調用本對象的操做時,一切都很天然,但咱們經常喜愛用一個指針指向某一個對象,指針是

萬惡之源,尤爲是當使用基類指針指向一個派生類對象時,會發生不少事情。

針對上面的代碼,使用這樣的main函數

int main()
{
    int i = 78;
    base *a = new derive();
    a->check(i);
}

當咱們執行完這個main函數,結果爲:

this is derive function

假如把類derive中check函數的參數改爲float i的話,結果就變成 this is base function 了,由此,我

們能夠發現,其實覆蓋只是另外一種形式的重載,是類間的重載,對於相同參數列表有效,能夠執行不一樣的操

做,可是,這仍是不夠,咱們須要更加普遍的重載,即使對於不一樣參數列表也有效,這就是以下的隱藏。

以代碼舉例:

class base
{
public:
void check(int i){cout<<"this is base function";}
};

class derive :public base
{
public:
void check(float i){cout<<"this is derive function";}
};

int main()
{
   
    int i = 78;
    base *a = new derive();
    a->check(i); 
}

最終結果爲: this is base function

即使在base的check函數前加了virtual,結果仍是同樣。

咱們進行最終總結:

重載:

1) 在同一類中;

2) 函數名字相同;

3) 參數不一樣;

4) Virtual關鍵字無關緊要

覆蓋:

1) 在不一樣範圍中(派生類與基類);

2) 函數名字相同;

3) 參數相同;

4) 必須有virtual關鍵字;

5) 若是函數返回值爲引用或指針,能夠修改成指向派生類的引用或指針

隱藏:

1) 範圍不一樣,函數名字相同,參數不一樣,Virtual關鍵字無關緊要;

2) 範圍不一樣,函數名字相同,參數相同,基類無virtual關鍵字。

覆蓋與隱藏運用中的區別:

覆蓋:調用函數取決於指針或引用的對象的類型;

隱藏:調用函數取決於指針或引用的類型。

日常建議使用相應指針指向相應對象,假如必定要用基類指針指向派生類對象的話,請必定注意覆蓋和隱藏的

有關事項,不然會有你想象不到的麻煩哦!

相關文章
相關標籤/搜索