C++中protected訪問許可權問題
阿新 • • 發佈:2019-02-09
今天發現有這樣兩句話:
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屬性不發生改變