2012-04-21 5 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

Вы можете получить доступ к protectedmemberAвнутриb. Вы пытаетесь получить доступ к нему со стороны. Это не имеет никакого отношения к наследованию.

Это происходит по той же причине, как следующее:

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 должно быть общедоступным.

Некоторые связанные с этим вопросы here и here.

+0

TNX цзюаней, любую хорошую ситуацию, на которой предпочтительная защищенный модификатор? все еще не может получить его значение :( – WantIt

+0

Я не могу придумать веские причины использовать защищенную переменную-член. Я видел использование защищенных функций, когда вы хотите разрешить производным классам использовать некоторые базовые функции класса, не делая эту функциональность общедоступной. Я бы сказал, используйте его, только если вы действительно знаете, что делаете! – juanchopanza

0

Вы можете получить доступ только protectedmemberA из рамок B (или A) - вы пытаетесь получить к нему доступ в main()

Смежные вопросы