Partilhar via


Ponteiros para classes

Há dois casos nos quais um ponteiro para uma classe pode ser convertido em um ponteiro para uma classe base.

Comentários

O primeiros é quando a classe base especificada estiver acessível e a conversão for inequívoca. (Consulte Várias classes base para obter mais informações sobre referências a classes base ambíguas.)

O acesso a uma classe base depende do tipo de herança usado na derivação. Considere a herança lustrada na figura a seguir.

Gráfico de herança para ilustração de acessibilidade a classe base

Gráfico de herança mostrando a acessibilidade de classe base

A tabela a seguir mostra a acessibilidade da classe base para a situação ilustrada na figura.

Acessibilidade da classe base

Tipo de função

Derivação

Conversão de

B* a A* válida?

Função externa (fora do escopo da classe)

Privado

Não

 

Protegido

Não

 

Público

Sim

Função membro B (no escopo de B)

Privado

Sim

 

Protegido

Sim

 

Público

Sim

Função membro C (no escopo de C)

Privado

Não

 

Protegido

Sim

 

Público

Sim

O segundo caso em que um ponteiro para uma classe pode ser convertido em um ponteiro para uma classe base é quando uma conversão de tipo explícita. (Consulte o tópico sobre expressões com conversões de tipo explícitas para obter mais informações sobre conversões de tipo explícitas.)

O resultado dessa conversão é um ponteiro para o "subobjeto", a parte do objeto que é totalmente descrita pela classe base.

O código a seguir define duas classes, A e B, onde B é derivado de A. (Para obter mais informações sobre herança, consulte Classes derivadas.) Ele define bObject, um objeto do tipo B, e dois ponteiros (pA e pB) que apontam para o 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
}

O ponteiro pA é do tipo A *, o que pode ser interpretado como “ponteiro para um objeto do tipo A”. Os membros de bObject (como BComponent e BMemberFunc) são exclusivos ao tipo B e, portanto, são inacessíveis por meio de pA. O ponteiro pA permite acesso somente às características (funções membro e dados) do objeto que são definidas na classe A.

Consulte também

Referência

Conversões de ponteiro (C++)