c++存取控制與繼承

來源:互聯網
上載者:User

標籤:

  最近,決定認真開始記錄自己的學習之路。

  c++類的存取控制有public、private和protected。

  首先要分簡單的基類和衍生類別情況,不是很容易混淆與多級繼承時的存取控制。自己原先搞得不清楚,也正是因為沒有分開二種情況對待。

  在簡單的基類和衍生類別情況中,其存取控制,可以簡單總結:

  public:   1、成員函數   2、類對象   3、友元  4、子類成員函數

  private:  1、成員函數  2、友元  

  protected:  1、成員函數  2、友元   3、子類成員函數

  這些基本都清楚,但是之前比較疑惑的就是繼承也有分public、private和protected。其實這是對衍生類別的子類起作用的,並不影響原先基類和衍生類別的存取控制。

  大致情況就是:

  假設是public繼承,那麼原先基類的public、private和protected的存取控制對此基類的衍生類別的子類不變。

  如果是protected繼承,則原先基類的public降為protected,並且也是對基類的衍生類別的子類起作用。

  而private繼承,則把原先基類的public、protected都降為private,並且也是對基類的衍生類別的子類起作用。

  可以把基類比喻為水龍頭,而衍生類別的public繼承為原水龍頭大小的管(簡稱大管)、protected繼承為中管、private繼承為小管,當水龍頭水通過水管是,則把原來水龍頭的水縮小了,所以只是對衍生類別子類起作用的。以下通過代碼解釋一下:

  class Base  
{  
    public: 
        int a1;  
        virtual void test() = 0;  
    protected:
        int a2;  
    private:  
        int a3;  
};  
//------------------------------------------------------------------------------  
class Protected_Class_1:protected Base//保護繼承  
{  
    public:  
        void test()  
        {  
            a1 = 1;//a1在這裡被轉變為protected  
            a2 = 2;//a2在這裡被轉變為protected  
            //a3=3;//錯誤,衍生類別不能訪問基類的私人成員  
        }  
};  
class Protected_Class_2:public Protected_Class_1//以public方式繼承Protected_Class_1類  
{  
    public:  
        void test()  
        {  
            a1 = 1;//a1在這裡仍然保持為a1在這裡被轉變為protected  
            a2 = 2;//a2在這裡仍然保持為a1在這裡被轉變為protected  
            //a3=3;//錯誤,由於Base類成員為私人的,即使是上級父類是保護繼承,也不能改變Base類成員的控制類型  
        }  
};  
//------------------------------------------------------------------------------  
class Private_Class_1:private Base//私人繼承  
{  
    public:  
        void test()  
        {  
            a1 = 1;//a1在這裡被轉變為private  
            a2 = 2;//a2在這裡被轉變為private  
            //a3=3;//錯誤,基類私人成員一樣是不可訪問的  
        }  
};  
class Private_Class_2:public Private_Class_1//以public方式繼承Private_Class_1類  
{  
    public:  
        void test()  
        {  
            //a1=1;//錯誤,由於基類Private_Class_1為私人繼承,a1已經轉變為private  
            //a2=2;//錯誤,由於基類Private_Class_1為私人繼承,a1已經轉變為private  
            //a3=3;//錯誤,由於Base類成員為私人的,Private_Class_1類也為私人繼承  
        }  
};  
//------------------------------------------------------------------------------  
class Public_Class_1:public Base//共有繼承有區別與其它方式的繼承,繼承後的各成員不會其改變控制方式  
{  
    public:  
        void test()  
        {  
            a1 = 1;//a1仍然保持public  
            a2 = 2;//a2仍然保持protected  
            //a3=3;//錯誤,衍生類別不能操作基類的私人成員  
        }  
};  
class Public_Class_2:public Public_Class_1//以public方式繼承Public_Class_1類  
{  
    public:  
        void test()  
        {  
            a1 = 1;//a1仍然保持public  
            a2 = 2;//a2仍然保持protected  
            //a3=3;//錯誤,由於Base類成員為私人成員,即使是上級父類是公有繼承,也不能改變Base類成員的控制類型  
        }  
}; 

 

 

 

  

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.