Δημόσια, προστατευμένη και ιδιωτική κληρονομικότητα στον προγραμματισμό 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 κληρονομείται ως προστατευμένο .
  • παμπ και 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;

Προσβασιμότητα στην ιδιωτική κληρονομιά

Προσιτότητα ιδιωτικά μέλη προστατευμένα μέλη δημόσια μέλη
Κατηγορία βάσης Ναί Ναί Ναί
Παράγωγη τάξη Οχι Ναι (κληρονομείται ως ιδιωτικές μεταβλητές) Ναι (κληρονομείται ως ιδιωτικές μεταβλητές)

ενδιαφέροντα άρθρα...