Compartir a través de


Punteros a clases

Hay dos casos en los que un puntero a una clase se puede convertir a un puntero a una clase base.

Comentarios

el primer caso es cuando la clase base especificada es accesible y la conversión es inequívoca.(Vea Varias clases base para obtener más información sobre las referencias ambiguas de la clase base).

si una clase base es accesible depende de la clase de herencia utilizada en la derivación.Considere la herencia mostrados en la siguiente ilustración.

Herencia Gráfico para la ilustración de la accesibilidad de la clase base

Accesibilidad a la clase base del gráfico de herencia

La tabla siguiente se muestra la accesibilidad de la clase base para el escenario mostrada en la ilustración.

accesibilidad de la clase base

tipo de función

derivación

conversión de

¿B* a* Legal?

función externa (no de la clase-scoped)

Private

No

 

Protected

No

 

Public

Función miembro b (en B Scope)

Private

 

Protected

 

Public

Función miembro de C (en el ámbito de C)

Private

No

 

Protected

 

Public

El segundo caso en el que un puntero a una clase se puede convertir a un puntero a una clase base es cuando se utiliza una conversión de tipos explícita.(Vea Expresiones con las conversiones de tipos Explicit para obtener más información sobre las conversiones de tipos explícitas.)

El resultado de dicha conversión es un puntero a “subobjeto,” la parte del objeto que se describe completamente por la clase base.

El código siguiente define dos clases, A y B, donde se deriva B de A.(Para obtener más información sobre herencia, vea clases derivadas.) A continuación define bObject, un objeto de Bcon tipo, y dos punteros (pA y pB) que señalen al objeto.

// conve__pluslang_Pointers_to_Classes.cpp
// C2039 expected
class A
{
public:
    int AComponent;
    int AMemberFunc();
};

class B : public A
{
public:
    int BComponent;
    int BMemberFunc();
};
int main()
{
   B bObject;
   A *pA = &bObject;
   B *pB = &bObject;

   pA->AMemberFunc();   // OK in class A
   pB->AMemberFunc();   // OK: inherited from class A
   pA->BMemberFunc();   // Error: not in class A
}

El puntero pA es de A *con tipo, que se pueden interpretar como significado “puntero a un objeto de Atipo”. Los miembros de bObject (como BComponent y BMemberFunc) son únicos escribir B y son por consiguiente pAdirecto inaccesible.El puntero de pA sólo permite el acceso a esas características (las funciones y los datos de miembro) del objeto que se define en la clase A.

Vea también

Referencia

Conversiones de puntero (C++)