Ereditarietà pubblica, protetta e privata nella programmazione C ++

In questo tutorial impareremo a usare l'ereditarietà pubblica, protetta e privata in C ++ con l'aiuto di esempi.

Nell'ereditarietà di C ++, possiamo derivare una classe figlia dalla classe base in diverse modalità di accesso. Per esempio,

 class Base (… .… … . ); class Derived : public Base (… .… … . );

Notare la parola chiave publicnel codice

 class Derived : public Base

Ciò significa che abbiamo creato una classe derivata dalla classe base in modalità pubblica . In alternativa, possiamo anche derivare classi in modalità protetta o privata .

Queste 3 parole chiave ( public, protectede private) sono note come specificatori di accesso nell'ereditarietà C ++.

eredità pubblica, protetta e privata in C ++

eredità pubblica , protetta e privata hanno le seguenti caratteristiche:

  • l'ereditarietà pubblica rende publicmembri della classe base publicnella classe derivata e i protectedmembri della classe base rimangono protectednella classe derivata.
  • l'ereditarietà protetta rende publice protectedmembri della classe base protectednella classe derivata.
  • l'ereditarietà privata rende i membri publice protecteddella classe base privatenella classe derivata.

Nota: i private membri della classe base non sono accessibili alla classe derivata.

 class Base ( public: int x; protected: int y; private: int z; ); class PublicDerived: public Base ( // x is public // y is protected // z is not accessible from PublicDerived ); class ProtectedDerived: protected Base ( // x is protected // y is protected // z is not accessible from ProtectedDerived ); class PrivateDerived: private Base ( // x is private // y is private // z is not accessible from PrivateDerived )

Esempio 1: ereditarietà pubblica C ++

 // C++ program to demonstrate the working of public inheritance #include using namespace std; class Base ( private: int pvt = 1; protected: int prot = 2; public: int pub = 3; // function to access private member int getPVT() ( return pvt; ) ); class PublicDerived : public Base ( public: // function to access protected member from Base int getProt() ( return prot; ) ); int main() ( PublicDerived object1; cout << "Private = " << object1.getPVT() << endl; cout << "Protected = " << object1.getProt() << endl; cout << "Public = " << object1.pub << endl; return 0; )

Produzione

 Privato = 1 Protetto = 2 Pubblico = 3

Qui, abbiamo derivato PublicDerivedda Basein modalità pubblica .

Di conseguenza, in PublicDerived:

  • prot viene ereditato come protetto .
  • pub e getPVT()vengono ereditati come pubblici .
  • pvt è inaccessibile poiché è privato in Base.

Poiché i membri privati e protetti non sono accessibili, è necessario creare funzioni pubbliche getPVT()e getProt()accedervi:

 // Error: member "Base::pvt" is inaccessible cout << "Private = " << object1.pvt; // Error: member "Base::prot" is inaccessible cout << "Protected = " << object1.prot;

Accessibilità nell'eredità pubblica

Accessibilità membri privati membri protetti membri pubblici
Classe di base
Classe derivata No

Esempio 2: ereditarietà protetta da C ++

 // C++ program to demonstrate the working of protected inheritance #include using namespace std; class Base ( private: int pvt = 1; protected: int prot = 2; public: int pub = 3; // function to access private member int getPVT() ( return pvt; ) ); class ProtectedDerived : protected Base ( public: // function to access protected member from Base int getProt() ( return prot; ) // function to access public member from Base int getPub() ( return pub; ) ); int main() ( ProtectedDerived object1; cout << "Private cannot be accessed." << endl; cout << "Protected = " << object1.getProt() << endl; cout << "Public = " << object1.getPub() << endl; return 0; )

Produzione

Non è possibile accedere al privato. Protetto = 2 Pubblico = 3

Qui, siamo derivati ProtectedDerivedda Basein modalità protetta .

Di conseguenza, in ProtectedDerived:

  • prot, pub e getPVT()vengono ereditati come protetti .
  • pvtè inaccessibile poiché è privato in Base.

Come sappiamo, non è possibile accedere direttamente ai membri protetti .

Di conseguenza, non possiamo utilizzare getPVT()da ProtectedDerived. Questo è anche il motivo per cui dobbiamo creare la getPub()funzione in ProtectedDerivedper accedere alla variabile pub.

 // Error: member "Base::getPVT()" is inaccessible cout << "Private = " << object1.getPVT(); // Error: member "Base::pub" is inaccessible cout << "Public = " << object1.pub;

Accessibilità in eredità protetta

Accessibilità membri privati membri protetti membri pubblici
Classe di base
Classe derivata No Sì (ereditato come variabili protette)

Esempio 3: ereditarietà privata C ++

 // C++ program to demonstrate the working of private inheritance #include using namespace std; class Base ( private: int pvt = 1; protected: int prot = 2; public: int pub = 3; // function to access private member int getPVT() ( return pvt; ) ); class PrivateDerived : private Base ( public: // function to access protected member from Base int getProt() ( return prot; ) // function to access private member int getPub() ( return pub; ) ); int main() ( PrivateDerived object1; cout << "Private cannot be accessed." << endl; cout << "Protected = " << object1.getProt() << endl; cout << "Public = " << object1.getPub() << endl; return 0; )

Produzione

Non è possibile accedere al privato. Protetto = 2 Pubblico = 3

Qui, abbiamo derivato PrivateDerivedda Basein modalità privata .

Di conseguenza, in PrivateDerived:

  • prot pube getPVT()vengono ereditati come privati .
  • pvt è inaccessibile poiché è privato in Base.

Come sappiamo, non è possibile accedere direttamente ai membri privati.

Di conseguenza, non possiamo utilizzare getPVT()da PrivateDerived. Questo è anche il motivo per cui dobbiamo creare la getPub()funzione in PrivateDerivedper accedere alla variabile pub.

 // Error: member "Base::getPVT()" is inaccessible cout << "Private = " << object1.getPVT(); // Error: member "Base::pub" is inaccessible cout << "Public = " << object1.pub;

Accessibilità in eredità privata

Accessibilità membri privati membri protetti membri pubblici
Classe di base
Classe derivata No Sì (ereditato come variabili private) Sì (ereditato come variabili private)

Articoli interessanti...