溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C++之繼承訪問權(quán)限

發(fā)布時間:2020-07-14 10:29:02 來源:網(wǎng)絡(luò) 閱讀:1804 作者:捕風(fēng)的xiao_k 欄目:編程語言


 接著上一篇總結(jié)訪問控制權(quán)限的博文,我們將上一篇遺留的繼承的訪問權(quán)限進(jìn)行總結(jié)。


1、首先我先強調(diào)一個問題,子類繼承了父類除了構(gòu)造函數(shù)和析構(gòu)函數(shù)的所有方法和屬性。包括private修飾的屬性和方法,這一點是很重要的,有很多人認(rèn)為私有的不被繼承,之所以產(chǎn)生這種誤區(qū),是子類中不可用父類的私有屬性。

2、類繼承后方法的屬性變化:

       1、使用private繼承,父類的protected和public屬性在子類中變?yōu)閜rivate,private屬性不變。

       2、使用protected繼承,父類的protected和public屬性在子類中變?yōu)閜rotected,private屬性不變。

       3、使用public繼承,父類的protected、public和private屬性不發(fā)生改變。

  強調(diào):private屬性被子類繼承,但是不能被子類使用。

    1、上邊只是概括的總結(jié)了一下,下來我將分別總結(jié)一下。

        (1)、對于公有繼承:

                1、基類成員對其對象的可見性:

                    公有成員可見,其他不可見。這里是保護成員與私有成員一樣不可見。

                2、基類成員對派生類的可見性

                    公有成員和保護成員可見,而私有成員不可見。這里保護成員同于公有成員一樣可見。

                3、基類成員都派生對象的可見性

                    公有可見,其他均不可見。

            也就是說,在公有繼承時,派生類的對象可以訪問基類中的公有成員;派生類的成員函數(shù)可以訪問基類中公有成員和保護成員。

                4、同樣我這里繼續(xù)給出測試驗證代碼:


class Base
{
public:
    Base():x(0),y(0),z(0)   {  }
    ~Base()    {    }
public:
    int x;
    void ShowBase()
    {
        cout<<"I am Show Base and am public"<<endl;
    }

protected:
    int y;
    void Print()
    {
        cout<<"I am Print and am protected "<<endl;
    
private:
    void Print_Private()
    {
        cout<<"I am Pint_Private"<<endl;
    }
    int z;
};
class D:public Base
{
public:
    D():a(0),b(0),c(0)   {  }
    ~D()    {    }
    int a;
    void Show_D()
    {
        cout<<"I am Show_D and public"<<endl;
        //測試公有繼承時,父類的公有方法和屬性
        ShowBase();   //父類的公有方法
        x = 10;           //父類的公有屬性
        cout<<"Base's x = "<<x<<endl;
        //測試公有繼承時,父類的保護方法和屬性
        Print();
        y = 20;
        cout<<"Base's y = "<<y<<endl;
        //測試公有繼承時,父類的私有方法和屬性
        //Print_Private();
        //z = 30;
        //cout<<"Base's z = "<<z<<endl;
    }
    void Test()
    {
        //驗證公有繼承再保護方法中
        Print_D();
        //驗證公有繼承再私有方法中
         fun_private();
    }
protected:
    void Print_D()
    {
        cout<<"I am Print_D and am protected"<<endl;
        //測試公有繼承時,父類的公有方法和屬性
        ShowBase();   //父類的公有方法
        x = 10;           //父類的公有屬性
        cout<<"Base's x = "<<x<<endl;
        //測試公有繼承時,父類的保護方法和屬性
        Print();
        y = 20;
        cout<<"Base's y = "<<y<<endl;
        //測試公有繼承時,父類的私有方法和屬性
        //Print_Private();
        //z = 30;
        //cout<<"Base's z = "<<z<<endl;
    }    
    int b;
private:
    void fun_private()
    {
        cout<<"I am fun_private"<<endl;
        //測試公有繼承時,父類的公有方法和屬性
        ShowBase();   //父類的公有方法
        x = 10;           //父類的公有屬性
        cout<<"Base's x = "<<x<<endl;
        //測試公有繼承時,父類的保護方法和屬性
        Print();
        y = 20;
        cout<<"Base's y = "<<y<<endl;
        //測試公有繼承時,父類的私有方法和屬性
        //Print_Private();
        //z = 30;
        //cout<<"Base's z = "<<z<<endl;
    }
    int c;

};
void main()
{
    D d1;
    d1.Show_D();
    //子類對象可以訪問父類的公有成員
    d1.ShowBase();

}


    測試結(jié)果:



C++之繼承訪問權(quán)限

    對于每一種情況我都給出了測試案例,并且在測試代碼中盡可能多按照我的理解寫上了注釋。


          2、對于保護繼承:

                1、基類成員對其對象的可見性

                     公有成員可見,其他不可見。這里是保護成員與私有成員一樣不可見。

                2、基類成員對派生類的可見性

                    公有成員和保護成員可見,而私有成員不可見。這里保護成員同于公有成員一樣可見。

                3、基類成員都派生對象的可見性

                    公有可見,其他均不可見。

                4、同樣我這里繼續(xù)給出測試驗證代碼:


class Base
{
public:
    Base():x(0),y(0),z(0)  {    }
    ~Base()   {   }
public:
    int x;
    void ShowBase()
    {
        cout<<"I am Show Base and am public"<<endl;
    }
protected:
    int y;
    void Print()
    {
        cout<<"I am Print and am protected "<<endl;
    }
private:
    void Print_Private()
    {
        cout<<"I am Pint_Private"<<endl;
    }
    int z;

};
class D:protected Base
{
public:
    D():a(0),b(0),c(0)  {   }
    ~D()  {  }
    int a;
    void Show_D()
    {
        cout<<"I am Show_D and public"<<endl;
        //測試保護繼承時,父類的公有方法和屬性
        ShowBase();   //父類的公有方法
        x = 10;           //父類的公有屬性
        cout<<"Base's x = "<<x<<endl;
        //測試保護繼承時,父類的保護方法和屬性
        Print();
        y = 20;
        cout<<"Base's y = "<<y<<endl;
        //測試保護繼承時,父類的私有方法和屬性
        //Print_Private();
        //z = 30;
        //cout<<"Base's z = "<<z<<endl;
    }
    void Test()
    {
        //驗證保護繼承再保護方法中
        Print_D();
        //驗證保護繼承再私有方法中
         fun_private();
    }
protected:
    void Print_D()
    {
        cout<<"I am Print_D and am protected"<<endl;
        //測試保護繼承時,父類的公有方法和屬性
        ShowBase();   //父類的公有方法
        x = 10;           //父類的公有屬性
        cout<<"Base's x = "<<x<<endl;
        //測試保護繼承時,父類的保護方法和屬性
        Print();
        y = 20;
        cout<<"Base's y = "<<y<<endl;
        //測試保護繼承時,父類的私有方法和屬性
        //Print_Private();
        //z = 30;
        //cout<<"Base's z = "<<z<<endl;
    }  
    int b;
private:
    void fun_private()
    {
        cout<<"I am fun_private"<<endl;
        //測試保護繼承時,父類的公有方法和屬性
        ShowBase();   //父類的公有方法
        x = 10;           //父類的公有屬性
        cout<<"Base's x = "<<x<<endl;
        //測試保護繼承時,父類的保護方法和屬性
        Print();
        y = 20;
        cout<<"Base's y = "<<y<<endl;
        //測試保護繼承時,父類的私有方法和屬性
        //Print_Private();
        //z = 30;
        //cout<<"Base's z = "<<z<<endl;
    }
    int c;
};


void main()
{
    D d1;
    d1.Show_D();
    //子類對象可以訪問父類的公有成員
    //d1.ShowBase();

    運行結(jié)果:


C++之繼承訪問權(quán)限


           3、對于私有繼承

                 1、基類成員對其對象的可見性:

                        公有成員可見,其他不可見。

                 2、基類成員對派生類的可見性

                     公有成員和保護成員可見,而私有成員不可見。這里保護成員同于公有成員一樣可見。

                 3、基類成員都派生對象的可見性

                    所有成員均不可見。

              也就是說,私有繼承,基類成員的只能由直接派生類訪問,而無法再往下繼續(xù)訪問。

                 4、同樣我這里也給出測試代碼:


class Base
{

public:
    Base():x(0),y(0),z(0)
    {
    }
    ~Base()
    {

    }
public:
    int x;
    void ShowBase()
    {
        cout<<"I am Show Base and am public"<<endl;
    }

protected:
    int y;
    void Print()
    {
        cout<<"I am Print and am protected "<<endl;
    }

private:
    void Print_Private()
    {
        cout<<"I am Pint_Private"<<endl;
    }
    int z;

};


class D:private Base
{

public:
    D():a(0),b(0),c(0)
    {

    }

    ~D()
    {

    }
    int a;
    void Show_D()
    {
        cout<<"I am Show_D and public"<<endl;
        //測試私有繼承時,父類的公有方法和屬性
        ShowBase();   //父類的公有方法
        x = 10;           //父類的公有屬性
        cout<<"Base's x = "<<x<<endl;
        //測試私有繼承時,父類的保護方法和屬性
        Print();
        y = 20;
        cout<<"Base's y = "<<y<<endl;
        //測試私有繼承時,父類的私有方法和屬性
        //Print_Private();
        //z = 30;
        //cout<<"Base's z = "<<z<<endl;
    }


    void Test()
    {
        //驗證私有繼承再保護方法中
        Print_D();
        //驗證私有繼承再私有方法中
         fun_private();
    }
protected:
    void Print_D()
    {
        cout<<"I am Print_D and am protected"<<endl;
        //測試私有繼承時,父類的公有方法和屬性
        ShowBase();   //父類的公有方法
        x = 10;           //父類的公有屬性
        cout<<"Base's x = "<<x<<endl;
        //測試私有繼承時,父類的保護方法和屬性
        Print();
        y = 20;
        cout<<"Base's y = "<<y<<endl;
        //測試私有繼承時,父類的私有方法和屬性
        //Print_Private();
        //z = 30;
        //cout<<"Base's z = "<<z<<endl;
    }

    
    int b;
private:
    void fun_private()
    {
        cout<<"I am fun_private"<<endl;
        //測試私有繼承時,父類的公有方法和屬性
        ShowBase();   //父類的公有方法
        x = 10;           //父類的公有屬性
        cout<<"Base's x = "<<x<<endl;
        //測試私有繼承時,父類的保護方法和屬性
        Print();
        y = 20;
        cout<<"Base's y = "<<y<<endl;
        //測試私有繼承時,父類的私有方法和屬性
        //Print_Private();
        //z = 30;
        //cout<<"Base's z = "<<z<<endl;
    }
    int c;

};



    class C:public D
    {
    public:
        C(){}
        ~C(){}
        void c_fun()
        {
        cout<<"I am  c_fun  and public"<<endl;
        //測試?yán)^承時,父類的公有方法和屬性
        ShowBase();   //父類的公有方法
        x = 100;           //父類的公有屬性
        cout<<"Base's x = "<<x<<endl;
        //測試保護繼承時,父類的保護方法和屬性
        Print();
        y = 200;
        cout<<"Base's y = "<<y<<endl;
        //測試保護繼承時,父類的私有方法和屬性
        //Print_Private();
        //z = 300;
        //cout<<"Base's z = "<<z<<endl;
        }
    protected:    
    private:
    };


void main()
{
    D d1;
    d1.Show_D();
    C c1;
    //保護繼承時,當(dāng)再次被繼承時,即使時公有繼承,對象將不能再訪問
    //c1.ShowBase();
    //子類對象可以訪問父類的公有成員
    //d1.ShowBase();
}

    測試結(jié)果:


    C++之繼承訪問權(quán)限

    細(xì)心同學(xué)就會發(fā)現(xiàn),私有繼承和保護繼承的測試結(jié)果不是一樣嗎?事實上是不一樣的,我在私有繼承的測試代碼中再加了一個類,C類,并且C類繼承于D類,我們可以從測試結(jié)果中看出,當(dāng)D類私有繼承時,C類將不能訪問Base類的任何成員,當(dāng)然C類的對象更不能訪問,而如果D類保護繼承與Base時,C類可以訪問Base的公有、保護成員,當(dāng)然對象也不能訪問。


    以上就是筆者對繼承中訪問控制權(quán)限的理解,并且給出了測試代碼幫助理解,希望可以幫助到大家。

                

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI