2011-03-01 24 views
9

tengo una clase simple como a continuaciónAcceso a un miembro de la clase de base en clase derivada

class A { 
     protected: 
     int x; 
     }; 

class B:public A 
     { 
     public: 
     int y; 
     void sety(int d) 
     { 
     y=d; 
     } 
     int gety(){ return y;} 
     }; 

int main() 
{ 
B obj; 
obj.sety(10); 
cout<<obj.gety(); 
getch(); 
} 

¿Cómo puede I establecer el valor de la protected instancia de variable A::x desde una instancia de la class B derivado sin crear una instancia de class A .

EDIT: ¿Podemos acceder al valor de A::x usando el objeto de B? Me gusta obj.x?

+0

Solo tiene que acceder. Es visible dentro de las funciones de miembros de B. – Erik

Respuesta

9

Bes unA, por lo que la creación de una instancia de B es la creación de una instancia de A. Dicho esto, no estoy seguro de lo que su pregunta real es, así que aquí tiene algo de código que se espera aclarar las cosas:

class A 
{ 
protected: 
    int x; 
}; 

class B : public A 
{ 
public: 
    int y; 

    int gety() const { return y; } 
    void sety(int d) { y = d; } 

    int getx() const { return x; } 
    void setx(int d) { x = d; } 
}; 

int main() 
{ 
    B obj; 

    // compiles cleanly because B::sety/gety are public 
    obj.sety(10); 
    std::cout << obj.gety() << '\n'; 

    // compiles cleanly because B::setx/getx are public, even though 
    // they touch A::x which is protected 
    obj.setx(42); 
    std::cout << obj.getx() << '\n'; 

    // compiles cleanly because B::y is public 
    obj.y = 20; 
    std::cout << obj.y << '\n'; 

    // compilation errors because A::x is protected 
    obj.x = 84; 
    std::cout << obj.x << '\n'; 
} 

obj pueden acceder a A::x simplemente como una instancia de A podía, porque obj es implícitamente una instancia de A.

+0

Puede que quiera mencionar el alcance y cómo eso afecta el acceso también. – reuscam

+0

@reuscam, editado para mayor claridad (con suerte) – ildjarn

0

Usted sólo puede referirse a él simplemente como x en la clase B

Por ejemplo:

class B : public A 
{ 
public: 
    ... 

    void setx(int d) 
    { 
     x=d; 
    } 
}; 
1

A::x está protegido, por lo que no se puede acceder desde el exterior, ni como A().x ni B().x. Sin embargo, es accesible en los métodos A y aquellos que lo heredan directamente (porque están protegidos, no son privados), p. B. Por lo tanto, independientemente de la semántica B::sety() puede acceder a ella (como x simple o como A::x en caso de sombreado por un B::x o por pura verbosidad).

0

Tenga en cuenta que B no tiene acceso COMPLETO a A :: x. Sólo se puede acceder a ese miembro a través de una instancia de un B, no se nada de tipo A o derivados de A.

Hay una solución que puede poner en:

class A 
{ 
    protected: 
    int x; 
    static int& getX(A& a) 
    { 
     return a.x; 
    } 

    static int getX(A const& a) 
    { 
    return a.x; 
    } 
}; 

y ahora usando getX, una clase derivado de A (como B) puede llegar al miembro x de CUALQUIER clase A.

También sabe que la amistad no es transitiva o heredada. Se puede hacer la misma "solución alternativa" para estas situaciones proporcionando funciones de acceso.

Y en su caso, puede proporcionar acceso "público" a la x a través de su B al tener funciones públicas que la lleven a cabo. Por supuesto, en la programación real está protegido por un motivo y no desea dar acceso total a todo, pero puede hacerlo.

+0

Totalmente correcto, pero para un principiante debe contrastar esto con el comportamiento de 'private:' – MSalters

Cuestiones relacionadas