Controllo dell'accesso e membri statici
Quando si definisce una classe base come private, tale classe influisce solo sui membri non statici. I membri statici pubblici sono ancora accessibili nelle classi derivate. Tuttavia, l'accesso ai membri della classe base utilizzando i puntatori, i riferimenti o gli oggetti può richiedere una conversione, momento in cui viene nuovamente applicato il controllo di accesso. Si consideri l'esempio seguente:
// access_control.cpp
class Base
{
public:
int Print(); // Nonstatic member.
static int CountOf(); // Static member.
};
// Derived1 declares Base as a private base class.
class Derived1 : private Base
{
};
// Derived2 declares Derived1 as a public base class.
class Derived2 : public Derived1
{
int ShowCount(); // Nonstatic member.
};
// Define ShowCount function for Derived2.
int Derived2::ShowCount()
{
// Call static member function CountOf explicitly.
int cCount = Base::CountOf(); // OK.
// Call static member function CountOf using pointer.
cCount = this->CountOf(); // C2247. Conversion of
// Derived2 * to Base * not
// permitted.
return cCount;
}
Nel codice precedente, il controllo di accesso impedisce la conversione da un puntatore a Derived2 in un puntatore a Base. Il puntatore this è implicitamente di tipo Derived2 *. Per selezionare la funzione CountOf, this deve essere convertito nel tipo Base *. Tale conversione non è consentita perché Base è una classe base indiretta privata di Derived2. La conversione in un tipo di classe base privata è accettabile solo per i puntatori alle classi derivate immediate. Di conseguenza, i puntatori di tipo Derived1 * possono essere convertiti nel tipo Base *.
Si noti che la chiamata alla funzione CountOf in modo esplicito, senza utilizzare un puntatore, un riferimento o un oggetto per selezionarla, non implica alcuna conversione. La chiamata è pertanto consentita.
I membri e gli elementi friend di una classe derivata, T, possono convertire un puntatore a T in un puntatore a una classe base diretta privata T.