Spécificateurs d'accès pour les classes de base
Deux facteurs contrôlent les membres d'une classe de base qui sont accessibles dans une classe dérivée. Ces mêmes facteurs contrôlent l'accès aux membres hérités dans la classe dérivée :
Si la classe dérivée doit déclarer la classe de base à l'aide du spécificateur d'accès public dans class-head (class-head est décrit dans la section Grammaire de la rubrique Définition des types de classes).
Quel est l'accès au membre de la classe de base.
Le tableau suivant montre l'interaction entre ces facteurs et la procédure de détermination de l'accès au membre de la classe de base.
Accès au membre de la classe de base
private |
protected |
Public |
---|---|---|
Toujours inaccessible quel que soit l'accès de dérivation |
Privé dans la classe dérivée si vous utilisez la dérivation privée |
Privé dans la classe dérivée si vous utilisez la dérivation privée |
|
Protégé dans la classe dérivée si vous utilisez la dérivation protégée |
Protégé dans la classe dérivée si vous utilisez la dérivation protégée |
|
Protégé dans la classe dérivée si vous utilisez la dérivation publique |
Public dans la classe dérivée si vous utilisez la dérivation publique |
L'exemple suivant illustre ce comportement :
// access_specifiers_for_base_classes.cpp
class BaseClass
{
public:
int PublicFunc(); // Declare a public member.
protected:
int ProtectedFunc(); // Declare a protected member.
private:
int PrivateFunc(); // Declare a private member.
};
// Declare two classes derived from BaseClass.
class DerivedClass1 : public BaseClass
{
};
class DerivedClass2 : private BaseClass
{
};
int main()
{
}
Dans DerivedClass1, la fonction membre PublicFunc est un membre public et ProtectedFunc est un membre protégé car BaseClass est une classe de base publique. PrivateFunc est privé pour BaseClass et inaccessible à toutes les classes dérivées.
Dans DerivedClass2, les fonctions PublicFunc et ProtectedFunc sont considérées comme des membres privés car BaseClass est une classe de base privée. À nouveau, PrivateFunc est privé pour BaseClass et inaccessible à toutes les classes dérivées.
Vous pouvez déclarer une classe dérivée sans spécificateur d'accès de classe de base. Dans ce cas, la dérivation est considérée comme privée si la déclaration de classe dérivée utilise le mot clé class. La dérivation est considérée comme publique si la déclaration de classe dérivée utilise le mot clé struct. Par exemple, le code suivant :
class Derived : Base
...
équivaut à :
class Derived : private Base
...
De même, le code suivant :
struct Derived : Base
...
équivaut à :
struct Derived : public Base
...
Notez que les membres déclarés comme ayant un accès privé ne sont pas accessibles aux fonctions ou aux classes dérivées si ces fonctions ou classes ne sont pas déclarées à l'aide de la déclaration friend dans la classe de base.
Un type union ne peut pas avoir de classe de base.
Notes
Pour spécifier une classe de base privée, il est recommandé d'utiliser explicitement le mot clé private afin que les utilisateurs de la classe dérivée comprennent l'accès au membre.