Puntatori a classi
Esistono due casi in cui un puntatore a una classe può essere convertito in un puntatore a una classe base.
Note
Il primo caso è quando la classe base specificata è accessibile e la conversione non è ambigua. Per ulteriori informazioni sui riferimenti ambigui della classe base, vedere Più classi base.
L'accessibilità di una classe base dipende dal tipo di ereditarietà utilizzato nella derivazione. Esaminare l'ereditarietà illustrata nella seguente figura.
Grafico dell'ereditarietà per l'illustrazione dell'accessibilità delle classi base
Nella tabella seguente viene illustrata l'accessibilità della classe base per la situazione illustrata nella figura.
Accessibilità della classe base
Tipo di funzione |
Derivazione |
Conversione da B* a A* valida? |
---|---|---|
Funzione esterna (non a livello dell'ambito della classe) |
Private |
No |
|
Protetto |
No |
|
Public |
Yes |
Funzione del membro B (nell'ambito B) |
Private |
Yes |
|
Protetto |
Yes |
|
Public |
Yes |
Funzione del membro C (nell'ambito C) |
Private |
No |
|
Protetto |
Yes |
|
Public |
Yes |
Il secondo caso in cui un puntatore a una classe può essere convertito in un puntatore a una classe base è quando si utilizza una conversione di tipo esplicita. Per ulteriori informazioni sulle conversioni di tipi esplicite, vedere Espressioni con le conversioni di tipi esplicite.
Il risultato di tale conversione è un puntatore al "sotto-oggetto", la parte dell'oggetto descritto completamente dalla classe base.
Nel codice seguente vengono definite due classi, A e B, dove B è derivata da A. Per ulteriori informazioni sull'ereditarietà, vedere Classi derivate. Definisce quindi bObject un oggetto di tipo B e due puntatori (pA e pB) che puntano all'oggetto.
// 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
}
Il puntatore pA è di tipo A *, che può essere interpretato con il significato di "puntatore a un oggetto di tipo A". I membri di bObject (come BComponent e BMemberFunc) sono univoci B e sono pertanto inaccessibili mediante pA. Il puntatore pA consente l'accesso solo a quelle caratteristiche (funzioni membro e dati) dell'oggetto definite nella classe A.