簡體   English   中英

受保護的繼承是否允許派生類訪問其基類的私有成員?

[英]Does protected inheritance allow the derived class access the private members of its base class?

我對私有繼承和受保護的繼承感到困惑。

1)在受保護的繼承中,public和protected成員在派生類中成為受保護的成員。 在私人繼承中,一切都是私人的。 但是,派生類永遠不能訪問基類的私有成員,是嗎? 派生類可以在兩種情況下訪問公共成員和受保護成員。 那正確嗎?

2)我注意到派生類永遠不會觸及基類的私有成員。 那么為什么私人成員繼承了?

你在第一點是正確的。 從基類繼承時指定privateprotectedpublic不會在派生類本身上以任何訪問方式更改任何內容。 這些訪問說明符告訴編譯器在其他地方使用派生類的實例時如何處理基類成員,或者派生類恰好用作其他類的基類。

更新:以下內容可能有助於說明差異:

class Base
{
    private:   int base_pri;
    protected: int base_pro;
    public:    int base_pub;
};

對於從base派生的類:

class With_Private_Base :   private Base   { void memberFn(); };
class With_Protected_Base : protected Base { void memberFn(); };
class With_Public_Base :    public Base    { void memberFn(); };

// this would be the same for all of the above 3 classes:
void With_PXXX_Base::memberFn()
{
    base_pri = 1; // error: `int Base::base_pri' is private
    base_pro = 1; // OK
    base_pub = 1; // OK
}

對於從3個派生類派生的類:

class A : public With_Private_Base { void memberFn(); }
void A::memberFn()
{
    base_pri = 1; // error: `int Base::base_pri' is private
    base_pro = 1; // error: `int Base::base_pro' is protected
    base_pub = 1; // error: `int Base::base_pub' is inaccessible
}

class B : public With_Protected_Base { void memberFn(); }
void B::memberFn()
{
    base_pri = 1; // error: `int Base::base_pri' is private
    base_pro = 1; // OK
    base_pub = 1; // OK
}

class C : public With_Public_Base { void memberFn(); }
void C::memberFn()
{
    base_pri = 1; // error: `int Base::base_pri' is private
    base_pro = 1; // OK
    base_pub = 1; // OK
}

對前三個派生類的外部訪問:

void main()
{
    With_Private_Base   pri_base;
    pri_base.base_pri = 1; // error: `int Base::base_pri' is private
    pri_base.base_pro = 1; // error: `int Base::base_pro' is protected
    pri_base.base_pub = 1; // error: `int Base::base_pub' is inaccessible

    With_Protected_Base pro_base;
    pro_base.base_pri = 1; // error: `int Base::base_pri' is private
    pro_base.base_pro = 1; // error: `int Base::base_pro' is protected
    pro_base.base_pub = 1; // error: `int Base::base_pub' is inaccessible

    With_Public_Base    pub_base;
    pub_base.base_pri = 1; // error: `int Base::base_pri' is private
    pub_base.base_pro = 1; // error: `int Base::base_pro' is protected
    pub_base.base_pub = 1; // OK
}

1a)受保護的繼承意味着“子”可以訪問公共繼承中的所有內容,但使用該對象的其他人只能看到子對象的公共接口,隱藏其父級中的任何內容。

1b)私有繼承導致類的所有公共函數作為私有函數繼承 - 這意味着它們不能從子進程調用或從對象的客戶端訪問。

2)私有成員是繼承的,因為基類中的方法可能需要它們來操作。

  1. 是的,這是正確的。 派生類可以訪問其基類的受保護和公共成員,派生類無法訪問其基類的私有成員。

  2. 私有成員是由於以下原因而繼承的:基類可以定義修改基類的私有成員的受保護或公共函數。 派生類可以調用此函數,因此需要知道它正在訪問的私有變量。

1)在受保護的繼承中,public和protected成員在派生類中成為受保護的成員。 在私人繼承中,一切都是私人的。 但是,派生類永遠不能訪問基類的私有成員,是嗎?

是。

派生類可以在兩種情況下訪問公共成員和受保護成員。 那正確嗎?

是。

2)我注意到派生類永遠不會觸及基類的私有成員。 那么為什么私人成員繼承了?

因為它們是基類的一部分,所以您需要基類,它是派生類的一部分。 注意,您仍然可以使用非重寫的public / protected成員函數來操作基類中維護的某些狀態(如果有)。

1)你是對的。 沒有任何類型的繼承允許訪問私有成員(只有friend聲明允許)

2)它們是“繼承的”,因為Derived類型的對象在存儲在內存中時,包括Derived和Base的所有數據成員,包括Base的私有成員。 私有成員不能隨便離開,因為當Base的方法運行在該對象上時,他們將需要訪問Base的私有成員。

此外,Base的私有成員的名稱在技術上屬於Derived方法的范圍,但是如果您嘗試訪問它們,當然會遇到編譯錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM