1. 程式人生 > ><C++ - 繼承02> 2018-01-24

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

情況 文件 get 形參 秘密 傳遞 輸出 輸出格式 father

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