2009-06-08 52 views
11

que no he hecho en C++ en un tiempo y no puedo entender por qué no funciona siguiente:¿Por qué no puedo acceder a un miembro protegido desde una instancia de una clase derivada?

class A { 
protected: 
    int num; 
}; 

class B : public A { 
}; 

main() { 
    B * bclass = new B(); 
    bclass->num = 1; 
} 

Compilación esto produce:

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

¿Los miembros no protegidos deben ser accesibles por clases derivadas?

¿Qué me estoy perdiendo?

Respuesta

31

los miembros protegidos sí son accesibles por clases derivadas pero 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.

+0

¡Gracias! Veo mi error ahora –

13

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

ejemplo:

#include <iostream> 

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 num se accede desde el interior de la clase B. num tendría que ser declarado público para poder acceder a él como bclass->num.

8

Se puede acceder dentro del alcance de las funciones de B, pero está intentando acceder a ella en la página principal.

6

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

3

"Protegido" significa protegido contra el 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.

4

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 hereda 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 
} 
0

Si no puede acceder a los miembros de datos protegidos en function.But principal se puede acceder a los miembros de datos protegidas de principal mediante la creación de la función de llamada Derivado.

+0

¿Ya no hay suficientes respuestas a esta pregunta? – matsjoyce

Cuestiones relacionadas