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