Membri di istanza e statici di controllo di accesso
Quando si specifica una classe di base come private, 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 possono richiedere una conversione, quando il controllo di accesso viene applicata di nuovo.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 un puntatore a Base.ciò il puntatore viene implicitamente di tipo Derived2 *.Per selezionare CountOf funzione, ciò deve essere convertito nel tipo Base *.Tale conversione non è valida perché Base è una classe base indiretta privata a Derived2.La conversione in un tipo privato della classe base è accettabile solo per i puntatori alle classi derivate immediata.di conseguenza, puntatori di tipo Derived1 * può essere convertito nel tipo Base *.
Si noti che la chiamata CountOf la funzione in modo esplicito, senza utilizzare un puntatore, riferimento, o oggetto per selezionarlo, ciò non implica conversione.Pertanto, la chiamata è consentita.
Membri e friend di una classe derivata, T, è possibile convertire un puntatore a T in un puntatore a una classe base diretta privata di T.