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

Accessibilità della classe base della rappresentazione grafica dell'eredità

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

Funzione membro di B (in B)

Private

 

Protected

 

Public

Funzione membro di C# (in C#)

Private

No

 

Protected

 

Public

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.

Vedere anche

Riferimenti

Conversioni del puntatore (C++)