В този урок ще се научим да използваме публично, защитено и частно наследство в 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;
Достъпност в частно наследство
Достъпност | частни членове | защитени членове | публични членове |
---|---|---|---|
Базов клас | Да | Да | Да |
Производен клас | Не | Да (наследено като частни променливи) | Да (наследено като частни променливи) |