Partager via


Contrôle d'accès et membres statiques

Lorsque vous spécifiez une classe de base comme private, elle affecte uniquement les membres non statiques. Les membres publics static sont toujours accessibles dans les classes dérivées. Toutefois, l'accès aux membres de la classe de base à l'aide de pointeurs, de références ou d'objets peut nécessiter une conversion, à laquelle 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 en un pointeur vers Base. Le pointeur this est implicitement de type Derived2 *. Pour sélectionner la fonction CountOf, this doit être converti en type Base *. Cette conversion n'est pas autorisée car Base est une classe de base indirecte privée à Derived2. La conversion en type de classe de base privée est acceptable uniquement pour les pointeurs vers des classes dérivées immédiates. Par conséquent, les pointeurs de type Derived1 * peuvent être convertis en type Base *.

Notez que lorsque vous appelez la fonction CountOf explicitement, sans utiliser de pointeur, de référence ou d'objet pour la sélectionner, cela n'implique aucune conversion. Par conséquent, l'appel est autorisé.

Les membres et les amis d'une classe dérivée, T, peuvent convertir un pointeur vers T en pointeur vers une classe de base directe privée de T.

Voir aussi

Référence

Spécificateurs d'accès pour les classes de base