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 basepublicnella classe derivata e iprotectedmembri della classe base rimangonoprotectednella classe derivata. - l'ereditarietà protetta rende
publiceprotectedmembri della classe baseprotectednella classe derivata. - l'ereditarietà privata rende i membri
publiceprotecteddella classe baseprivatenella 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 | sì | sì | sì |
| Classe derivata | No | sì | sì |
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 inBase.
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 | sì | sì | sì |
| Classe derivata | No | sì | 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
pubegetPVT()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 | sì | sì | sì |
| Classe derivata | No | Sì (ereditato come variabili private) | Sì (ereditato come variabili private) |








