Identificatori di accesso per le classi base
Un controllo di due fattori che i membri di una classe base sono accessibili in una classe derivata; accesso del controllo di questi lo stesso fattori ai membri ereditati nella classe derivata:
Se la classe derivata dichiara la classe di base utilizzando pubblico identificatore di accesso in classe-intestazione (classe-intestazione viene descritto nella sezione della grammatica in Definizione dei tipi di classe).
Ciò che l'accesso al membro è la classe base.
La tabella riportata di seguito viene illustrata l'interazione tra questi fattori e come determinare l'accesso al membro della classe base.
Accesso ai membri della classe base
private |
protected |
Public |
---|---|---|
Sempre accessibile indipendentemente dall'accesso di derivazione |
Privato nella classe derivata se si utilizza la derivazione privata |
Privato nella classe derivata se si utilizza la derivazione privata |
|
Protetto nella classe derivata se si utilizza la derivazione protetta |
Protetto nella classe derivata se si utilizza la derivazione protetta |
|
Protetto nella classe derivata se si utilizza la derivazione pubblica |
Pubblico nella classe derivata se si utilizza la derivazione pubblica |
Questa condizione è illustrata nell'esempio che segue.
// 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()
{
}
in DerivedClass1, la funzione membro PublicFunc è un membro pubblico e ProtectedFunc è un membro protetto perché BaseClass è una classe base pubblica.PrivateFunc è privato a BaseClassed è accessibile a tutte le classi derivate.
in DerivedClass2, le funzioni PublicFunc e ProtectedFunc sono considerati membri privati perché BaseClass è una classe base privata.Nuovamente, PrivateFunc è privato a BaseClassed è accessibile a tutte le classi derivate.
È possibile dichiarare una classe derivata senza un identificatore di accesso della classe base.In tal caso, la derivazione da considerare privata se la dichiarazione della classe derivata utilizza classe parola chiave.La derivazione da considerare pubblico se la dichiarazione della classe derivata utilizza struct parola chiave.Ad esempio, il seguente codice:
class Derived : Base
...
equivale a:
class Derived : private Base
...
Analogamente, il codice seguente:
struct Derived : Base
...
equivale a:
struct Derived : public Base
...
Si noti che i membri dichiarati con accesso privato non sono accessibili alle funzioni o alle classi derivate a meno che tali funzioni o classi vengano dichiarate utilizzando il friend dichiarazione della classe base.
In unione il tipo non può avere una sola classe base.
[!NOTA]
Quando si specifica una classe di base privata, si consiglia di utilizzare in modo esplicito private la parola chiave per consentire agli utenti della classe derivata ha compreso l'accesso al membro.