Condividi tramite


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

Rappresentazione grafica dell'ereditarietà con accessibilità della classe di 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.

Vedere anche

Riferimenti

Conversioni di puntatori (C++)