Державне, захищене та приватне успадкування у програмуванні на 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у похідному класі.
  • приватне успадкування робить 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;

Доступність у приватному спадщині

Доступність приватні члени захищені члени громадські члени
Базовий клас Так Так Так
Похідний клас Ні Так (успадковується як приватні змінні) Так (успадковується як приватні змінні)

Цікаві статті...