Condividi tramite


Identificatori di accesso per classi base

I due seguenti fattori controllano quali membri di una classe base sono accessibili in una classe derivata; questi stessi fattori controllano anche l'accesso ai membri ereditati presenti nella classe derivata:

  • Se la classe derivata dichiara la classe base mediante l'identificatore di accesso public in class-head (class-head è descritta nella sezione Grammatica di Definizione dei tipi di classe).

  • Quale è l'accesso ai membri presenti nella della classe base.

La tabella riportata di seguito mostra l'interazione tra questi fattori e come è possibile determinare l'accesso ai membri della classe base.

Accesso ai membri nella classe base

private

protected

Public

Sempre inaccessibile indipendentemente dall'accesso della 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 per BaseClass ed è accessibile a tutte le classi derivate.

In DerivedClass2 le funzioni PublicFunc e ProtectedFunc sono considerate membri privati perché BaseClass è una classe base privata. Anche in questo caso PrivateFunc è privato per BaseClass ed è inaccessibile a tutte le classi derivate.

È possibile dichiarare una classe derivata senza identificatore di accesso della classe base. In tal caso, la derivazione è considerata privata se la dichiarazione della classe derivata utilizza la parola chiave class. La derivazione è considerata pubblica se la dichiarazione della classe derivata utilizza la parola chiave struct. Ad esempio, il seguente codice:

class Derived : Base
...

equivale a:

class Derived : private Base
...

In modo analogo, il seguente codice.

struct Derived : Base
...

equivale a:

struct Derived : public Base
...

Tenere presente che i membri dichiarati con accesso privato non sono accessibili alle funzioni o alle classi derivate a meno che tali funzioni o classi non vengano dichiarate utilizzando la dichiarazione friend nella classe base.

Un tipo union non può avere una classe base.

Nota

Quando si specifica una classe base privata, si consiglia di utilizzare in modo esplicito la parola chiave private per consentire agli utenti della classe derivata di comprendere l'accesso al membro.

Vedere anche

Riferimenti

Controllo dell'accesso ai membri