У цьому посібнику ми навчимося використовувати загальнодоступне, захищене та приватне успадкування в 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
у похідному класі. - приватне успадкування робить
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++ 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;
Доступність у приватному спадщині
Доступність | приватні члени | захищені члени | громадські члени |
---|---|---|---|
Базовий клас | Так | Так | Так |
Похідний клас | Ні | Так (успадковується як приватні змінні) | Так (успадковується як приватні змінні) |