2010-04-13 20 views
10

En C++ puede colocar un miembro en una clase base y un miembro con el mismo nombre en la clase heredada.clase heredada C++ tiene miembro del mismo nombre

¿Cómo puedo acceder a uno específico en la clase heredada?

+3

La pregunta que debes hacerte es ¿por qué tienes clases en la misma jerarquía de herencia que tienen miembros con nombre duplicado que son distintos? Consulte el artículo 33 eficaz de C++. – TheJuice

+0

Si su pregunta es cómo acceder al método derivado desde una referencia base o un puntero, agregue un comentario. Como está escrito, la pregunta se puede interpretar de dos maneras (y todas las respuestas se refieren a solo una de ellas) –

Respuesta

24

En ese caso, debe calificar completamente un nombre de miembro.

class A 
{ 
public: 
    int x; 
}; 


class B : public A 
{ 
public: 
    int x; 
    B() 
    { 
    x = 0; 
    A::x = 1; 
    } 
}; 
2

Si lo prefijos con classname::.

7

Si especifica el nombre, accederá automáticamente al de la clase heredada. Si te refieres a cómo accedes al que está en la clase base, usa Base :: miembro

3

Sí.

Califique su llamada, f(), con un nombre de clase: SpecificClass::f().

6

Para acceder al miembro oculto en la clase base, tiene que ponerle un prefijo al nombre del miembro con el nombre de la clase base. Vea a continuación:

class A 
{ 
protected: 
    int i; 
}; 

class B : public A 
{ 
public: 
    void foo(void) 
    { 
     int a_i = A::i; 
     int b_i = i; 
     int b_i_as_well = B::i; 
    } 
private: 
    int i; 
}; 
+0

+2 [deseo] para el ejemplo. –

3

Un enfoque (ya mencionado en todas las demás respuestas) es utilizar el nombre de miembro cualificado, como Base::member. Se puede usar junto con el acceso explícito a través del puntero this, si ese es su estilo: this->Base::member.

Otro enfoque es realizar el acceso a través del puntero this convertido explícitamente al tipo de clase base: ((Base *) this)->member.

Por supuesto, las referencias anteriores al puntero this se realizan bajo la suposición de que usted está tratando de acceder al miembro desde alguna función miembro no estática de la clase. Para acceder desde "afuera", los mismos trucos se pueden aplicar a cualquier otro puntero (o referencia): some_pointer->Base::member o ((Base *) some_pointer)->member.

Para los miembros de datos estos dos enfoques son equivalentes. Para las funciones de miembro, pueden conducir a diferentes resultados con funciones virtuales. Por esta razón, en general, se debe preferir el primer enfoque.

Cuestiones relacionadas