<C++ - 繼承02> 2018-01-24

來源:互聯網
上載者:User

標籤:fun   關係   整理   輸入   建構函式   virt   沒有   參數   error   

01、繼承:

/*    回顧上節的內容:        1.繼承            1.1 吸收 父類成員            1.2 調整 父類成員(存取權限  公有 私人 受保護/隱藏)            1.3增加子類的新成員  實現更多功能        2.多繼承  -->繼承所有父類所有成員            菱形繼承 -->虛繼承  virtual    今晚 補充 複習  回顧:    繼承  吸收成員 --> 對象大小    1.類中      成員變數-->對象大小隻和成員變數有關      成員函數-->包含一個this指標  指向當前對象      成員  變數和函數並不在一起    static -->全域        father類的對象  -->int        如果調用成員函數  傳遞這個對象地址  給fun函數        void fun(father*this,int y);  如果能找到成員函數地址  也可以用這個方式去調用成員函數        1.成員變數 -->繼承過來        2.成員函數 -->通過傳遞父類對象的地址去調用父類的成員函數        虛繼承 -->只在孫子類中保留一份祖父的成員的拷貝        子類構造  一定會調用父類建構函式(調用無參構造)重點:   **多繼承  子類的構造要調用全部父類的建構函式        菱形繼承中  調用父類的建構函式後  還需要調用祖父類的建構函式        父類沒有寫構造  -->預設建構函式  沒有參數        類中有一個 沒有參數的構造的話  會在沒有寫構造的時候 自動調用這個函數        想要知道什麼地方需要調用構造  -->可以寫一個有參構造  看什麼地方出粗就行        父類 沒有預設構造(無參構造)  子類 必須顯性調用父類的建構函式  參數不需要統一                去掉無參構造  就只能調用有參構造  -->        什麼時候必須調用建構函式:                1.定義對象                2.函數傳遞參數(傳遞不是引用)                3.子類繼承父類的時候,調用父類的建構函式        虛繼承 -->只留一份拷貝        多繼承  不推薦使用學習的知識  分類  整理        FBI  warning    什麼        error            繼承        什麼時候調用父類的構造        warning         記憶體分布        protected  --> 傳家寶   可以傳給兒子        private    --> 私人的小秘密  可以傳  但是兒子不能訪問            繼承之后里面的內容都會繼承過去  能不能訪問看許可權(繼承過後成員屬性的表格)    如果說一些原理  想不明白  可以直接記結論    拷貝構造  -->參數必須引用    多繼承    -->虛繼承  只會留一份祖父的拷貝    重點:        調用:建構函式  調用時機 --> 繼承時候  子類必須調用父類建構函式        (一般情況  子類調用父類  父類會調用祖父類   子類不需要單獨調用祖父類)                補充 菱形繼承的時候  虛繼承 需要單獨調用祖父的建構函式        其餘(不重要)        記憶體分布 (想要瞭解可以瞭解)不要求掌握*/#include <iostream>using namespace std;class father        // 父類{public:    int x;    father(int x) :x(x){}    ~father(){}    void fun(int y){}};class son :public father        // 子類{public:    int y;    son(int x, int y) :y(y), father(x){}  // 子類的建構函式 需要調用父類的建構函式 只能寫在初始化形參列表    ~son(){}};int main(){    son st(2, 3);    cout << st.x << st.y << endl;    cout << hex << &st.x << &st.y << endl;    getchar();    return 0;}/*    繼承之後的資料部分的關係*/struct fat{    int x;};struct so{    struct fat da;    int y;};/*    虛繼承*//*    原有的作業上還成所有建構函式全部換成由參數的構造(選做)    輸入輸出格式  cout       IO流:        1.檔案操作        2.cin  cout*/

 

02、虛繼承:

#include <iostream>using namespace std;class A{public:    int x;    A(int x) :x(x){} // A中的構造private:};class B :virtual public A{public:    B(int x) :A(x){}};class C :virtual public A{public:    C(int x) :A(x){}};class D :public B, public C{public:    D(int x) :C(0), B(1), A(2){}  // 子類的話  需要全部父類的建構函式  以及調用祖父類的構造    void fun()    {        B::x = 0x12;        C::x = 0x34;  // 0x34 -->52    }};// 類的成員指標  位移量  瞭解(指標大小  4個不同)int main(){    int A::*p = &A::x;    cout << sizeof(D) << endl;   //     D d(232);    d.fun();    cout << d.x << endl;    /*d.fun();    int *p = (int*)&d;   // 強轉    cout << p[0] << ‘\t‘ << p[1] << ‘\t‘ << p[2] << ‘\t‘ << endl;    */    getchar();    return 0;}

 

03、執行個體:

#include <iostream>using namespace std;class grandfather   // 祖父類{public:    int x;};class father :virtual public grandfather  // 父類{};class mother :public grandfather{};class son :public father, public mother{};int main(){    cout << sizeof(son) << endl;    son summer;    int *p = (int*)&summer;    cout << &p[0] << endl;    cout << hex << p[0] << endl;    cout << p[2] << endl;    cout << &p[2] << endl;    getchar();    return 0;}

<C++ - 繼承02> 2018-01-24

聯繫我們

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