Σε αυτό το σεμινάριο, θα μάθουμε να χρησιμοποιούμε δημόσια, προστατευμένη και ιδιωτική κληρονομιά στο 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 κληρονομείται ως προστατευμένο .
- παμπ και
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;
Προσβασιμότητα στην ιδιωτική κληρονομιά
Προσιτότητα | ιδιωτικά μέλη | προστατευμένα μέλη | δημόσια μέλη |
---|---|---|---|
Κατηγορία βάσης | Ναί | Ναί | Ναί |
Παράγωγη τάξη | Οχι | Ναι (κληρονομείται ως ιδιωτικές μεταβλητές) | Ναι (κληρονομείται ως ιδιωτικές μεταβλητές) |