Ponteiros para Classes
Há dois casos em que um ponteiro para uma classe pode ser convertido para um ponteiro para uma classe base.
Comentários
O primeiro caso é quando a classe base especificada é acessível e a conversão não é ambígua.(Consulte Várias Classes Base para obter mais informações sobre referências ambíguas da classe base.)
Se uma classe base é acessível depende do tipo de herança usado na derivação.Considere a herança ilustrada na figura a seguir.
Gráfico de herança para ilustração de acessibilidade da classe Base
A tabela a seguir mostra a acessibilidade de classe base para a situação ilustrada na figura.
Acessibilidade da classe base
Tipo de função |
Derivação |
Conversão de B * A * jurídicos? |
---|---|---|
Função externa de (não com escopo classe) |
Private |
Não |
|
Protegido |
Não |
|
Público |
Sim |
Função de membro B (em escopo B) |
Private |
Sim |
|
Protegido |
Sim |
|
Público |
Sim |
Função de membro c (em escopo C) |
Private |
Não |
|
Protegido |
Sim |
|
Público |
Sim |
O segundo caso em que um ponteiro para uma classe pode ser convertido para um ponteiro para uma classe base é quando você usa uma conversão de tipo explícito.(Consulte expressões com conversões de tipo explícito para obter mais informações sobre as conversões de tipo explícito.)
O resultado de tal conversão é um ponteiro para o "subobjeto," a parte do objeto que é descrita completamente pela classe base.
O código a seguir define duas classes, A e B, onde B é derivada de A.(Para obter mais informações sobre herança, consulte Classes derivadas de.) Ele define, em seguida, bObject, um objeto do tipo Be dois ponteiros (pA e pB) que aponte 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 *, que podem ser interpretados como significado "ponteiro para um objeto do tipo A." Os membros do bObject(, como BComponent e BMemberFunc) são exclusivos para digitar B e, portanto, não estão acessíveis por meio de pA. O pA ponteiro permite o acesso apenas a essas características (funções de membro e dados) do objeto que são definidas na classe A.