2012-04-21 183 views
4

爲什麼基類中的受保護成員不能在派生類中訪問?受保護的成員不能在派生類中訪問

class ClassA 
{ 
public: 
    int publicmemberA; 

protected: 
    int protectedmemberA; 

private: 
    int privatememberA; 

    ClassA(); 
}; 

class ClassB : public ClassA 
{ 
}; 

int main() 
{ 
    ClassB b; 
    b.protectedmemberA; // this says it is not accesible, violation? 
    //..... 
} 

回答

9

您可以訪問protectedmemberAb。您正試圖從外部訪問它。它與繼承無關。

會出現這種情況同樣的原因如下:

class B 
{ 
protected: 
    int x; 
}; 

//... 

B b; 
b.x = 0; //also illegal 
3

因爲保護成員纔可見B級的範圍內所以您可以訪問這裏例如:

class ClassB : public ClassA 
{ 
    void foo() { std::cout << protectedMember;} 
}; 

但表達如

someInstance.someMember; 

要求someMember公開。

一些相關的SO問題herehere

+0

TNX胡安內訪問它,在其上首選protected修飾符任何良好局面?仍然不能得到它的意義:( – WantIt 2012-04-21 14:45:59

+0

我想不出一個很好的理由來使用受保護的成員變量。當你想允許派生類使用某些基類功能而不公開該功能時,我已經看到使用受保護的函數。我會說,只有在你真的知道你在做什麼的時候才使用它! – juanchopanza 2012-04-21 14:51:15

0

只能的B(或A)範圍內的訪問protectedmemberA從 - 你試圖main()