C++ 繼承(二)

來源:互聯網
上載者:User

標籤:c++   繼承   二   

多態是一種泛型程式設計的思想,虛函數是其實現的手段(利用父類的指標指向子類的空間)。好了 , 開始本文->

來一段基本代碼:

#include <iostream>using namespace std;class CPeople{public:    virtual void goHome()    {        cout << " Go Home" << endl;    }};class Aonaufly : public CPeople{    void goHome()    {        cout << " Go Wuhan" << endl;    }};int main(){    CPeople * people_1 = new Aonaufly;    people_1->goHome();    delete people_1;    return 0;}

運行結果:

650) this.width=650;" title="01.png" alt="wKioL1ks4XPz2xRPAAClzH0yxAY513.png-wh_50" src="https://s1.51cto.com/wyfs02/M02/97/4B/wKioL1ks4XPz2xRPAAClzH0yxAY513.png-wh_500x0-wm_3-wmp_4-s_1361009472.png" />

解析 :

① 虛函數的關鍵字是 : virtual (定義格式 : virtual void goHome())

② 子類中也有一個goHome函數,因為在父類中goHome函數是個虛函數。所以子類中的goHome 與 父類中的goHome形成了重寫。(虛函數形成重寫 , 普通函數形成覆蓋)

③ CPeople * people_1 = new Aonaufly; 即用 利用父類的指標指向子類的空間。(不能申明為棧 , 因為棧區隊形沒有指標概念)這種形式在C# / Java當中也很常見

④ 實際上在子類中的virtual可以省略不寫,編譯會自動加上

650) this.width=650;" title="03.png" alt="wKioL1ks5LTRSPZNAACSoflP7a8269.png-wh_50" src="https://s5.51cto.com/wyfs02/M02/97/4B/wKioL1ks5LTRSPZNAACSoflP7a8269.png-wh_500x0-wm_3-wmp_4-s_3729285149.png" />


如果,在子類中不重寫虛函數 :

#include <iostream>using namespace std;class CPeople{public:    virtual void goHome()    {        cout << " Go Home" << endl;    }};class Aonaufly : public CPeople{};int main(){    CPeople * people_1 = new Aonaufly;    people_1->goHome();    delete people_1;    return 0;}

結果:

650) this.width=650;" title="02.png" alt="wKioL1ks48zxYmgiAAAnUtBRBv0801.png-wh_50" src="https://s5.51cto.com/wyfs02/M00/97/4B/wKioL1ks48zxYmgiAAAnUtBRBv0801.png-wh_500x0-wm_3-wmp_4-s_3454476977.png" />

解析:

① 因為子類沒有重寫父類虛函數goHome,所以調用父類的goHome


純虛函數 -> 沒有實現的函數

#include <iostream>using namespace std;class CPeople{public:    virtual void goHome() = 0;};class Aonaufly : public CPeople{    virtual void goHome()    {        cout << " Go Wuhan" << endl;    }};int main(){    CPeople * people_1 = new Aonaufly;    people_1->goHome();    delete people_1;    return 0;}

結果:

650) this.width=650;" title="04.png" alt="wKioL1ks5fDBwqxuAABOd-LPp4w242.png-wh_50" src="https://s1.51cto.com/wyfs02/M01/97/4B/wKioL1ks5fDBwqxuAABOd-LPp4w242.png-wh_500x0-wm_3-wmp_4-s_3534523528.png" />

解析:

① 純虛函數 virtual void goHome() = 0 。一個父類中都是純虛函數,這個類就是介面類 ; 如果這個父類不全是純函數那這個父類就是抽象類別。

② 有純虛函數的類 , 不能被執行個體化 。只能通過繼承 , 在子類中實現(必須在子類中重寫)


重點補充:

① 重寫虛函數 , 函數名稱 /  函數參數列表 / 函數傳回值類型必須是一樣(絕大部分情況 )

② 特殊情況:

#include <iostream>using namespace std;class CPeople{public:    virtual CPeople& goHome()    {        cout << " Go Home" << endl;        return (*this);    }};class Aonaufly : public CPeople{    virtual Aonaufly& goHome()    {        cout << " Go Wuhan" << endl;        return (*this);    }};int main(){    CPeople * people_1 = new Aonaufly;    people_1->goHome();    delete people_1;    return 0;}

結果:

650) this.width=650;" title="05.png" alt="wKiom1ks6OyBRjVXAACokLJBbbY379.png-wh_50" src="https://s5.51cto.com/wyfs02/M01/97/4A/wKiom1ks6OyBRjVXAACokLJBbbY379.png-wh_500x0-wm_3-wmp_4-s_2648999543.png" />

這是一個特殊的情況傳回值不一樣也會構成重寫 , 這個情況叫協變。


虛析構

為了時子類,父類中的機構函數都被調用,需要使用虛析構(不然 , 只會調用父類的的 )

#include <iostream>using namespace std;class CPeople{public:    virtual CPeople& goHome()    {        cout << " Go Home" << endl;        return (*this);    }    virtual ~CPeople()    {        cout << "Cpeople" << endl;    }};class Aonaufly : public CPeople{    virtual Aonaufly& goHome()    {        cout << " Go Wuhan" << endl;        return (*this);    }    ~Aonaufly()    {        cout << "Aonaufly" << endl;    }};int main(){    CPeople * people_1 = new Aonaufly;    //people_1->goHome();    delete people_1;    return 0;}

結果:

650) this.width=650;" title="06.png" alt="wKioL1ks6_ORcF1JAAAcgI1mzMI361.png-wh_50" src="https://s5.51cto.com/wyfs02/M01/97/4B/wKioL1ks6_ORcF1JAAAcgI1mzMI361.png-wh_500x0-wm_3-wmp_4-s_2532180410.png" />


關於虛繼承

存在多繼承的時候一定要使用虛繼承

B,C繼承於A 。 D繼承B和C。若A與一個參數a,使用D.a就會造成歧義(從B,C繼承了2個a)。那麼B,C都要使用虛繼承

class B : virtual public A

虛繼承 只是繼承使用權(相當於指標),並不複製A中的a

本文出自 “Better_Power_Wisdom” 部落格,請務必保留此出處http://aonaufly.blog.51cto.com/3554853/1930677

C++ 繼承(二)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.