Публично, защитено и частно наследство в програмирането на C ++

В този урок ще се научим да използваме публично, защитено и частно наследство в C ++ с помощта на примери.

В наследяването на C ++ можем да извлечем дъщерен клас от базовия клас в различни режими на достъп. Например,

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

Забележете ключовата дума publicв кода

 class Derived : public Base

Това означава, че сме създали производен клас от базовия клас в публичен режим . Друга възможност е да извлечем класове в защитен или частен режим.

Тези 3 ключови думи ( public,, protectedи private) са известни като спецификатори на достъп в наследяването на C ++.

публично, защитено и частно наследство в C ++

публичното , защитеното и частното наследство имат следните характеристики:

  • публичното наследяване прави publicчленовете на базовия клас publicв производния клас, а protectedчленовете на базовия клас остават protectedв производния клас.
  • защитеното наследяване прави publicи protectedчленове на базовия клас protectedв производния клас.
  • private наследяване прави publicи protectedчленове на базовия клас privateв производен клас.

Забележка: private членовете на базовия клас са недостъпни за производния клас.

 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 )

Пример 1: 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; )

Изход

 Частно = 1 Защитено = 2 Обществено = 3

Тук сме извлекли PublicDerivedот Baseв публичен режим .

В резултат на това в PublicDerived:

  • prot се наследява като защитен .
  • кръчма и getPVT()се наследяват като публични .
  • pvt е недостъпен, тъй като е частен в Base.

Тъй като частните и защитените членове не са достъпни, трябва да създадем публични функции getPVT()и getProt()да имаме достъп до тях:

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

Достъпност в публичното наследство

Достъпност частни членове защитени членове публични членове
Базов клас Да Да Да
Производен клас Не Да Да

Пример 2: 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; )

Изход

Частен не може да бъде достъпен. Защитено = 2 Публично = 3

Тук сме извлекли ProtectedDerivedот Baseв защитен режим .

В резултат на това в ProtectedDerived:

  • prot, pub и getPVT()се наследяват като защитени .
  • pvtе недостъпен, тъй като е частен в Base.

Както знаем, защитените членове не могат да бъдат директно достъпни.

В резултат на това не можем да използваме getPVT()от ProtectedDerived. Ето защо трябва да създадем getPub()функцията, ProtectedDerivedза да имаме достъп до променливата pub.

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

Достъпност при защитено наследство

Достъпност частни членове защитени членове публични членове
Базов клас Да Да Да
Производен клас Не Да Да (наследено като защитени променливи)

Пример 3: Частно наследяване на 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; )

Изход

Частен не може да бъде достъпен. Защитено = 2 Публично = 3

Тук сме извлекли PrivateDerivedот Baseв частен режим .

В резултат на това в PrivateDerived:

  • prot pubи getPVT()се наследяват като частни .
  • pvt е недостъпен, тъй като е частен в Base.

Както знаем, частните членове не могат да бъдат директно достъпни.

В резултат на това не можем да използваме getPVT()от PrivateDerived. Ето защо трябва да създадем getPub()функцията, PrivateDerivedза да имаме достъп до променливата pub.

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

Достъпност в частно наследство

Достъпност частни членове защитени членове публични членове
Базов клас Да Да Да
Производен клас Не Да (наследено като частни променливи) Да (наследено като частни променливи)

Интересни статии...