Spécificateurs d'accès pour les classes de base
Deux facteurs déterminent les membres d'une classe de base sont accessibles dans une classe dérivée ; accès au contrôle de ces le même facteurs aux membres hérités dans la classe dérivée :
Si la classe dérivée déclare la classe de base à l'aide de le spécificateur d'accès de public dans le classe-HEAD (le classe-HEAD est décrit dans la section de syntaxe dans définir des types de classe).
ce qui est l'accès au membre dans la classe de base.
le tableau suivant montre l'interaction entre ces facteurs et comment déterminer l'accès de membre de la classe de base.
Accès au membre dans la classe de base
private |
protected |
Public |
---|---|---|
toujours inaccessible indépendamment de 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ée dans la classe dérivée si vous utilisez la dérivation protégée |
Protégée dans la classe dérivée si vous utilisez la dérivation protégée |
|
Protégée 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é à BaseClass, et il est inaccessible dans toute classe dérivée.
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.De même, PrivateFunc est privé à BaseClass, et il est inaccessible dans toute classe dérivée.
Vous pouvez déclarer une classe dérivée sans spécificateur d'accès de la 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é de classe .La dérivation est considérée comme public si la déclaration de classe dérivée utilise le mot clé d' 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 accès privé ne sont pas accessibles aux fonctions ou aux classes dérivées à moins que ces fonctions ou classes sont déclarées à l'aide de la déclaration d' friend dans la classe de base.
un type union ne peut pas avoir une classe de base.
[!REMARQUE]
En spécifiant une classe de base privée, il est recommandé d'utiliser le mot clé explicitement d' private afin que les utilisateurs de la classe dérivée incluez l'accès au membre.