Открытое, защищенное и частное наследование в программировании на 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 ++

 // 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 наследуется как protected .
  • pub и getPVT()унаследованы как public .
  • 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()наследуются как protected .
  • pvtнедоступен, так как он частный в Base.

Как мы знаем, к защищенным членам нельзя получить доступ напрямую.

В результате мы не можем использовать getPVT()from 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()from PrivateDerived. Вот почему нам нужно создать getPub()функцию PrivateDerived, чтобы получить доступ к переменной pub.

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

Доступность в частном наследовании

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

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