Puntatori alle classi
Esistono due casi in cui un puntatore a una classe può essere convertito in un puntatore a una classe di base.
Note
Il primo caso è quando la classe base specificata è accessibile e la conversione non è ambiguo.(Vedere Più classi di base per ulteriori informazioni sui riferimenti ambigui della classe base).
Se una classe base non accessibile dipende dal tipo di ereditarietà utilizzato nella derivazione.Considerare l'ereditarietà illustrata nella figura che segue.
Grafico di ereditarietà per completezza di accessibilità della classe base
Nella tabella seguente vengono illustrati l'accessibilità della classe base per questa situazione viene illustrata nella figura.
Accessibilità della classe base
tipo di funzione |
derivazione |
conversione da B* a A* valido? |
---|---|---|
(Funzione esterna non di classe-scoped) |
Private |
No |
|
Protected |
No |
|
Public |
Sì |
Funzione membro di B (in B) |
Private |
Sì |
|
Protected |
Sì |
|
Public |
Sì |
Funzione membro di C# (in C#) |
Private |
No |
|
Protected |
Sì |
|
Public |
Sì |
Il secondo caso in cui un puntatore a una classe può essere convertito in un puntatore a una classe di base è quando si utilizza una conversione del tipo esplicita.(Vedere Espressione con le conversioni esplicite del tipo per ulteriori informazioni sulle conversioni di tipi esplicite.)
Il risultato di tale conversione è un puntatore “del sotto-oggetto„, la parte dell'oggetto che è descritto dalla classe base.
Il codice seguente vengono definite due classi, A e B, dove B deriva da A.(Per ulteriori informazioni sull'ereditarietà, vedere classi derivate). Definisce quindi bObject, un oggetto di tipo Be 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 come puntatore di significato “in un oggetto di tipo A„. membri di bObject (come BComponent e BMemberFunc) essere univoco digitare B e sono pertanto diretti inaccessibili pA.pA il puntatore consente l'accesso solo alle caratteristiche (funzioni membro e dati) dell'oggetto definite nella classe A.