Contrôle d'accès et membres statiques
Lorsque vous spécifiez une classe de base comme private, il affecte uniquement les membres non statiques.Les membres statiques publics sont toujours accessibles dans les classes dérivées.Toutefois, les accès aux membres de la classe de base à l'aide de les pointeurs, les références, ou objets peuvent demander une conversion, lorsque le contrôle d'accès est encore appliqué.Prenons l'exemple suivant :
// 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;
}
Dans le code précédent, le contrôle d'accès interdit la conversion d'un pointeur vers Derived2 à un pointeur vers Base.le pointeur de cela est implicitement de type Derived2 *.Pour sélectionner la fonction d' CountOf , cela doit être converti en type Base *.Une telle conversion n'est pas autorisé parce qu' Base est une classe de base indirecte privée à Derived2.La conversion vers un type privé de la classe de base est acceptable uniquement pour les pointeurs vers des classes dérivées immédiates.Par conséquent, les pointeurs du type Derived1 * peuvent être convertis en un type Base *.
Notez que l'appel à la fonction d' CountOf explicitement, sans utiliser un pointeur, la référence, ou l'objet pour le sélectionner, n'implique aucune conversion.Par conséquent, l'appel.
Les membres et les fonctions friend d'une classe dérivée, T, peuvent convertir un pointeur vers T à un pointeur vers une classe de base directe privée d' T.