1. 程式人生 > >C++中protected訪問許可權問題

C++中protected訪問許可權問題

今天發現有這樣兩句話:
1. 基類的保護成員對於派生類的成員是可訪問的。
2. 派生類的成員只能通過派生類物件訪問基類的保護成員,派生類對一個基類物件中的受保護成員沒有訪問許可權。

這兩句話看的太頭暈了,其實作者應該是想表達:只有在派生類中才可以通過派生類物件訪問基類的protected成員。看這樣的程式碼:

class Base
{
public:
    Base();
private:
    void foo();
protected:
    int m;
};
class Derive : public Base
{
public:
    Derive();
};
Derive::Derive()
{
    this
->m = 1; // 這裡訪問m沒有問題 }

使用類的程式碼:

Derive *d = new Derive();
std::cout<< d->m <<endl;  // 這裡就報錯了

總結一下三個關鍵字的訪問範圍:
public: 能被類成員函式、子類函式、友元訪問,也能被類的物件訪問。
private: 只能被類成員函式及友元訪問,不能被其他任何訪問,本身的類物件也不行。
protected: 只能被類成員函式、子類函式及友元訪問,不能被其他任何訪問,本身的類物件也不行。

還是上面的兩個類,只看public和private,如下程式碼:

    Base *
b = new Base(); b->test_pub(); // 通過 b->foo(); // 報錯 std::cout<< b->m; // 報錯

protected繼承和private繼承能降低訪問許可權:

使用private繼承,父類的protected和public屬性在子類中變為private
使用protected繼承,父類的protected和public屬性在子類中變為protected
使用public繼承,父類中的protected和public屬性不發生改變