W tym samouczku nauczymy się korzystać z dziedziczenia publicznego, chronionego i prywatnego w C ++ na podstawie przykładów.
W dziedziczeniu C ++ możemy wyprowadzić klasę potomną z klasy bazowej w różnych trybach dostępu. Na przykład,
class Base (… .… … . ); class Derived : public Base (… .… … . );
Zwróć uwagę na słowo kluczowe public
w kodzie
class Derived : public Base
Oznacza to, że utworzyliśmy klasę pochodną z klasy bazowej w trybie publicznym . Alternatywnie możemy również wyprowadzać klasy w trybie chronionym lub prywatnym .
Te 3 słowa kluczowe ( public
, protected
i private
) są znane jako specyfikatory dostępu w dziedziczeniu w języku C ++.
dziedziczenie publiczne, chronione i prywatne w C ++
dziedziczenie publiczne , chronione i prywatne ma następujące cechy:
- dziedziczenie publiczne powoduje, że
public
elementy członkowskie klasy bazowej w klasiepublic
pochodnej, a elementyprotected
członkowskie klasy bazowej pozostająprotected
w klasie pochodnej. - chronione dziedziczenie powoduje, że
public
iprotected
elementy członkowskie klasy bazowej w klasieprotected
pochodnej. - dziedziczenie prywatne powoduje, że
public
iprotected
członkowie klasy bazowej w klasieprivate
pochodnej.
Uwaga: private
elementy składowe klasy bazowej są niedostępne dla klasy pochodnej.
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 )
Przykład 1: Dziedziczenie publiczne w 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; )
Wynik
Prywatna = 1 Chroniona = 2 Publiczna = 3
Tutaj wyprowadziliśmy PublicDerived
z Base
w trybie publicznym .
W rezultacie w PublicDerived
:
- prot jest dziedziczony jako chroniony .
- pub i
getPVT()
są dziedziczone jako publiczne . - pvt jest niedostępny, ponieważ jest prywatny w
Base
.
Ponieważ członkowie prywatni i chronieni nie są dostępni, musimy utworzyć funkcje publiczne getPVT()
i getProt()
uzyskać do nich dostęp:
// Error: member "Base::pvt" is inaccessible cout << "Private = " << object1.pvt; // Error: member "Base::prot" is inaccessible cout << "Protected = " << object1.prot;
Dostępność w dziedziczeniu publicznym
Dostępność | członkowie prywatni | chronionych członków | członkowie publiczni |
---|---|---|---|
Klasa podstawowa | tak | tak | tak |
Klasy pochodnej | Nie | tak | tak |
Przykład 2: Dziedziczenie chronione w języku 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; )
Wynik
Prywatne nie są dostępne. Chroniony = 2 Publiczny = 3
Tutaj wyprowadziliśmy ProtectedDerived
z Base
w trybie chronionym .
W rezultacie w ProtectedDerived
:
- prot, pub i
getPVT()
są dziedziczone jako chronione . pvt
jest niedostępny, ponieważ jest prywatny wBase
.
Jak wiemy, chronionych członków nie można uzyskać bezpośrednio.
W rezultacie nie możemy używać getPVT()
from ProtectedDerived
. Dlatego też musimy utworzyć getPub()
funkcję ProtectedDerived
, aby uzyskać dostęp do zmiennej pub.
// Error: member "Base::getPVT()" is inaccessible cout << "Private = " << object1.getPVT(); // Error: member "Base::pub" is inaccessible cout << "Public = " << object1.pub;
Dostępność w dziedziczeniu chronionym
Dostępność | członkowie prywatni | chronionych członków | członkowie publiczni |
---|---|---|---|
Klasa podstawowa | tak | tak | tak |
Klasy pochodnej | Nie | tak | Tak (dziedziczone jako chronione zmienne) |
Przykład 3: Dziedziczenie prywatne w 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; )
Wynik
Prywatne nie są dostępne. Chroniony = 2 Publiczny = 3
Tutaj mamy pochodzi PrivateDerived
od Base
w trybie prywatnym .
W rezultacie w PrivateDerived
:
- prot
pub
igetPVT()
są dziedziczone jako prywatne . - pvt jest niedostępny, ponieważ jest prywatny w
Base
.
Jak wiemy, bezpośredni dostęp do członków prywatnych nie jest możliwy.
W rezultacie nie możemy używać getPVT()
from PrivateDerived
. Dlatego też musimy utworzyć getPub()
funkcję PrivateDerived
, aby uzyskać dostęp do zmiennej pub.
// Error: member "Base::getPVT()" is inaccessible cout << "Private = " << object1.getPVT(); // Error: member "Base::pub" is inaccessible cout << "Public = " << object1.pub;
Dostępność w dziedziczeniu prywatnym
Dostępność | członkowie prywatni | chronionych członków | członkowie publiczni |
---|---|---|---|
Klasa podstawowa | tak | tak | tak |
Klasy pochodnej | Nie | Tak (dziedziczone jako zmienne prywatne) | Tak (dziedziczone jako zmienne prywatne) |