¿Por qué no puedo acceder a un miembro protegido desde una instancia de una clase derivada?

Hace tiempo que no uso C ++ y no puedo entender por qué el seguimiento no funciona:

class A { protected: int num; }; class B : public A { }; main () { B * bclass = new B (); bclass->num = 1; } 

Comstackr esto produce:

error C2248: ‘A :: num’: no ​​se puede acceder al miembro protegido declarado en la clase ‘A’

¿No deberían los miembros protegidos ser accesibles por clases derivadas?

¿Qué me estoy perdiendo?

sí, los miembros protegidos son accesibles por clases derivadas, pero usted está accediendo a él en la función main (), que está fuera de la jerarquía. Si declaras un método en la clase B y accedes num, estará bien.

Sí, los miembros protegidos son accesibles por la clase derivada, pero solo desde dentro de la clase.

ejemplo:

 #include  class A { protected: int num; }; class B : public A { public: void printNum(){ std::cout << num << std::endl; } }; main () { B * bclass = new B (); bclass->printNum(); } 

imprimirá el valor de num , pero se accede a num desde dentro de la clase B num tendría que ser declarado público para poder acceder a él como bclass->num .

Es accesible dentro del scope de las funciones de B, pero está intentando acceder a él en main.

Pero no estás accediendo a ella desde la clase derivada. Usted está accediendo desde main ().

Al utilizar una clase, realmente no hay diferencia entre los miembros protegidos y privados. Ninguno de los dos está disponible para nada que utilice la clase.

 class A { private: int privateNum; protected: int protectedNum; public: int publicNum; void SetNumbers(int num) { privateNum = num; //valid, private member can be accessed in member function protectedNum = num; //valid, protected member can be accessed in member function } }; void main() { A classA; classA.privateNum = 1; //compile error can't access private member classA.protectedNum = 1; //compile error can't access protected member classA.publicNum = 1; //this is OK classA.SetNumbers(1); //this sets the members not accessible directly } 

La diferencia entra en vigencia cuando heredas de una clase con miembros protegidos.

 class B : public A { }; 

Todos los miembros privados de una clase base siguen siendo privados y no serán accesibles para la clase derivada. Los miembros protegidos, por otro lado, son accesibles para la clase heredada, pero todavía no son accesibles fuera de la clase heredada.

 class B : public A { public: void SetBNumbers(int num) { privateNum = num; //compile error, privateNum can only be accessed by members of A, not B protectedNum = num; //this works, as protected members can be accessed by A and B } }; void main() { B classB; classB.publicNum = 1; //valid, inherited public is still public classB.protectedNum = 1; //compile error, can't access protected member classB.privateNum = 1; //compile error, B doesn't know that privateNum exists classB.SetBNumbers(1); //this sets the members not accessible directly } 

“Protegido” significa protegido del acceso fuera de una función miembro, o una función miembro de una clase derivada. La función “principal” no es miembro de ninguna clase, pero está intentando acceder directamente a la variable miembro.

Estás viendo exactamente lo que se espera. Pruebe esto: http://www.learncpp.com/cpp-tutorial/115-inheritance-and-access-specifiers/ para obtener información sobre los especificadores de acceso a herencia.

Sí, no puede acceder a los miembros de datos protegidos en la función principal. Sin embargo, puede acceder a los miembros de datos protegidos en la principal creando una función en Llamada derivada.