C++之繼承__C++

來源:互聯網
上載者:User

1)為什麼要繼承
實現代碼複用。
在執行個體化一個衍生類別對象時,先調用基類建構函式,在調用衍生類別建構函式;
銷毀衍生類別對象時,解構函式調用順序正好相反

#include<iostream>#include<string>using namespace std;class Person{public:    Person(){        cout << "Person()" << endl;    }    ~Person(){        cout << "~Person()" << endl;    }    void eat(){        cout << "eat()" << endl;    }    string m_strName;    int m_iAge;};class Worker :public Person{public:    Worker(){        cout << "Worker()" << endl;    }    ~Worker(){        cout << "~Worker()" << endl;    }    void worker(){        cout << "worker()" << endl;    }    int m_iSalary;};int main(){    Worker *pWorker = new Worker();    delete pWorker;    pWorker = NULL;    return 0;}

2)繼承方式
a.公有繼承
class A:public B

基類      public      protected       private衍生類別    public       protected       無法訪問

b)保護繼承
class A:protected B

基類      public          protected       private衍生類別    protected        protected       無法訪問

c)私人繼承
cladd A:private B

基類      public      protected       private衍生類別    private      private         無法訪問

3)隱藏和覆蓋
父類 void f();
子類 void f();
當執行個體化子類對象時,只能訪問子類的f();隱藏了父類的f();
總結:父子關係 成員同名 隱藏

覆蓋是指衍生類別函數覆蓋基類函數,特徵是:
不同的範圍(分別位於衍生類別與基類);
函數名字相同;
參數相同;
基類函數必須有virtual關鍵字。

4)Is_a關係
eg:人類是基類,衍生類別為士兵和工人,士兵和工人都是人類。
衍生類別對象可以向基類對象轉換,反之不可以

5)多繼承和多重繼承
多重繼承 人類->士兵類->步兵類
多繼承 :一個衍生類別有多個基類

class Worker{};class Farmer{};class MigrantWorker:ppublic Worker.public Farmer{};預設情況下,以private繼承#include<iostream>#include<string>using namespace std;class Farmer{public:    Farmer(string name="Jack"){        m_strName = name;        cout << "Farmer()" << endl;    }    virtual ~Farmer(){        cout << "~Farmer()" << endl;    }    void sow();protected:    string m_strName;};void Farmer::sow(){    cout << m_strName << endl;    cout << "Farmer--souw()" << endl;}class Worker{public:    Worker(string code="001"){        m_strCode = code;        cout << "Worker()" << endl;    }    virtual ~Worker(){        cout << "~Worker()" << endl;    }    void carry(){        cout << m_strCode << endl;        cout << "Worker--carry()" << endl;    }protected:    string m_strCode;};class MigrantWorker:public Farmer,public Worker{public:    MigrantWorker(string name, string code);    ~MigrantWorker(){        cout << "~MigrantWorker()" << endl;    }};MigrantWorker::MigrantWorker(string name, string code) :Farmer(name), Worker(code){//建構函式與初始化列表順序一致    cout << "MigranWorker()" << endl;}int main(){    MigrantWorker *p = new MigrantWorker("huheqing", "112");    p->carry();    p->sow();    delete p;    p = NULL;    return 0;}

6)虛繼承

菱形繼承
既有多繼承又有多重繼承,存在資料冗餘問題
Class Worker:virtual public Person{

};
Class Farmer:virtual public Person{

};
Class MigranFarmer:public Worker,public Farmer{

};
注意:在多繼承或者多重繼承時,在執行個體化對象時,父類帶參數的建構函式的實參通過子類的建構函式初始化列表進行傳遞

#include<iostream>#include<string>using namespace std;class Person{public:    Person(string color="blue"){        m_strColor = color;        cout << "Person()" << endl;    }    virtual ~Person(){        cout << "~Person()" << endl;    }    void printColor(){        cout << m_strColor << endl;        cout << "printColor()" << endl;    }protected:    string m_strColor;};class Farmer:virtual public Person{public:    Farmer(string name = "Jack", string color = "blue"):Person(color){        m_strName = name;        cout << "Farmer()" << endl;    }    virtual ~Farmer(){        cout << "~Farmer()" << endl;    }    void sow();protected:    string m_strName;};void Farmer::sow(){    cout << m_strName << endl;    cout << "Farmer--souw()" << endl;}class Worker:virtual public Person{public:    Worker(string code = "001", string color = "blue") :Person(color){        m_strCode = code;        cout << "Worker()" << endl;    }    virtual ~Worker(){        cout << "~Worker()" << endl;    }    void carry(){        cout << m_strCode << endl;        cout << "Worker--carry()" << endl;    }protected:    string m_strCode;};class MigrantWorker:public Farmer,public Worker{public:    MigrantWorker(string name, string code,string color);    ~MigrantWorker(){        cout << "~MigrantWorker()" << endl;    }};MigrantWorker::MigrantWorker(string name, string code,string color) :Farmer(name,color), Worker(code,color){//建構函式與初始化列表順序一致    cout << "MigranWorker()" << endl;}int main(){    MigrantWorker *p = new MigrantWorker("huheqing", "112","black");    p->carry();    p->sow();    delete p;    p = NULL;    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.