Openbare, beschermde en privé-erfenis in C ++ -programmering

In deze tutorial zullen we aan de hand van voorbeelden leren om openbare, beschermde en privé-overerving te gebruiken in C ++.

Bij overerving van C ++ kunnen we een kindklasse afleiden uit de basisklasse in verschillende toegangsmodi. Bijvoorbeeld,

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

Let op het sleutelwoord publicin de code

 class Derived : public Base

Dit betekent dat we een afgeleide klasse hebben gemaakt van de basisklasse in de openbare modus . Als alternatief kunnen we ook klassen afleiden in beschermde of privé- modi.

Deze 3 trefwoorden ( public, protecteden private) worden genoemd toegangsspecificaties in C ++ overerving.

openbare, beschermde en privé-erfenis in C ++

openbare , beschermde en privé- overerving hebben de volgende kenmerken:

  • openbare overerving zorgt ervoor dat publicleden van de basisklasse publicin de afgeleide klasse blijven, en de protectedleden van de basisklasse blijven protectedin de afgeleide klasse.
  • beschermde overerving maakt de publicen protectedleden van de basisklasse protectedin de afgeleide klasse.
  • private overerving maakt de publicen protectedleden van de basisklasse privatein de afgeleide klasse.

Opmerking: private leden van de basisklasse zijn niet toegankelijk voor de afgeleide klasse.

 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 )

Voorbeeld 1: C ++ openbare erfenis

 // 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; )

Uitvoer

 Privé = 1 Beveiligd = 2 Openbaar = 3

Hier hebben we afgeleid PublicDeriveduit Basein de openbare modus .

Als resultaat in PublicDerived:

  • prot wordt overgeërfd als beschermd .
  • pub en getPVT()worden als openbaar overgeërfd .
  • pvt is niet toegankelijk omdat het privé is in Base.

Aangezien privé- en beschermde leden niet toegankelijk zijn, moeten we openbare functies creëren getPVT()en getProt()deze openen:

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

Toegankelijkheid bij openbare erfenis

Toegankelijkheid particuliere leden beschermde leden openbare leden
Basisklasse Ja Ja Ja
Afgeleide klasse Nee Ja Ja

Voorbeeld 2: C ++ beschermde overerving

 // 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; )

Uitvoer

Privé is niet toegankelijk. Beveiligd = 2 Openbaar = 3

Hier hebben we afgeleid ProtectedDeriveduit Basein beschermde modus .

Als resultaat in ProtectedDerived:

  • prot, pub en getPVT()worden overgeërfd als beschermd .
  • pvtis niet toegankelijk omdat het privé is in Base.

Zoals we weten, zijn beschermde leden niet rechtstreeks toegankelijk.

Als gevolg hiervan kunnen we geen gebruik maken getPVT()van van ProtectedDerived. Dat is ook de reden waarom we de getPub()functie moeten maken ProtectedDerivedom toegang te krijgen tot de pub-variabele.

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

Toegankelijkheid in beschermde erfenis

Toegankelijkheid particuliere leden beschermde leden openbare leden
Basisklasse Ja Ja Ja
Afgeleide klasse Nee Ja Ja (overgenomen als beschermde variabelen)

Voorbeeld 3: C ++ privé-overerving

 // 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; )

Uitvoer

Privé is niet toegankelijk. Beveiligd = 2 Openbaar = 3

Hier hebben we afgeleid PrivateDeriveduit Basein de privémodus .

Als resultaat in PrivateDerived:

  • prot, puben getPVT()worden overgeërfd als privé .
  • pvt is niet toegankelijk omdat het privé is in Base.

Zoals we weten, zijn privé-leden niet rechtstreeks toegankelijk.

Als gevolg hiervan kunnen we geen gebruik maken getPVT()van van PrivateDerived. Dat is ook de reden waarom we de getPub()functie moeten maken PrivateDerivedom toegang te krijgen tot de pub-variabele.

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

Toegankelijkheid in privé-erfenis

Toegankelijkheid particuliere leden beschermde leden openbare leden
Basisklasse Ja Ja Ja
Afgeleide klasse Nee Ja (overgenomen als privévariabelen) Ja (overgenomen als privévariabelen)

Interessante artikelen...