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
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.