Σε αυτό το σεμινάριο, θα μάθουμε για την κληρονομιά στο C ++ με τη βοήθεια παραδειγμάτων.
Το κληρονομικό είναι ένα από τα βασικά χαρακτηριστικά του αντικειμενοστραφούς προγραμματισμού στο C ++. Μας επιτρέπει να δημιουργήσουμε μια νέα τάξη (προερχόμενη κλάση) από μια υπάρχουσα τάξη (βασική τάξη).
Η παράγωγη κλάση κληρονομεί τα χαρακτηριστικά από την βασική τάξη και μπορεί να έχει πρόσθετα δικά της χαρακτηριστικά. Για παράδειγμα,
class Animal ( // eat() function // sleep() function ); class Dog : public Animal ( // bark() function );
Εδώ, η Dog
τάξη προέρχεται από την Animal
τάξη. Δεδομένου ότι Dog
προέρχεται από Animal
, τα μέλη του Animal
είναι προσβάσιμα Dog
.
Παρατηρήστε τη χρήση της λέξης-κλειδιού public
ενώ κληρονομείτε το σκυλί από το Animal
class Dog : public Animal (… );
Μπορούμε επίσης να χρησιμοποιήσουμε τις λέξεις-κλειδιά private
και protected
αντί για public
. Θα μάθετε για τις διαφορές μεταξύ της χρήσης private
, public
και protected
αργότερα σε αυτό το σεμινάριο.
είναι-μια σχέση
Η κληρονομικότητα είναι μια σχέση . Χρησιμοποιούμε κληρονομιά μόνο εάν υπάρχει σχέση μεταξύ των δύο τάξεων.
Ορίστε μερικά παραδείγματα:
- Ένα αυτοκίνητο είναι ένα όχημα.
- Το πορτοκάλι είναι φρούτο.
- Ένας χειρουργός είναι γιατρός.
- Ένα σκυλί είναι ένα ζώο.
Παράδειγμα 1: Απλό παράδειγμα κληρονομικότητας C ++
// C++ program to demonstrate inheritance #include using namespace std; // base class class Animal ( public: void eat() ( cout << "I can eat!" << endl; ) void sleep() ( cout << "I can sleep!" << endl; ) ); // derived class class Dog : public Animal ( public: void bark() ( cout << "I can bark! Woof woof!!" << endl; ) ); int main() ( // Create object of the Dog class Dog dog1; // Calling members of the base class dog1.eat(); dog1.sleep(); // Calling member of the derived class dog1.bark(); return 0; )
Παραγωγή
Μπορώ να φάω! Μπορώ να κοιμηθώ! Μπορώ να γαβγίσω! ΓΑΒ ΓΑΒ!!
Εδώ, το dog1 (το αντικείμενο της προερχόμενης κλάσης Dog
) μπορεί να έχει πρόσβαση σε μέλη της βασικής κλάσης Animal
. Είναι επειδή Dog
κληρονομείται από Animal
.
// Calling members of the Animal class dog1.eat(); dog1.sleep();
Μέλη που προστατεύονται από το C ++
Ο τροποποιητής πρόσβασης protected
είναι ιδιαίτερα σχετικός όταν πρόκειται για κληρονομιά C ++.
Όπως τα private
μέλη, τα protected
μέλη δεν είναι προσβάσιμα εκτός της τάξης. Ωστόσο, μπορούν να έχουν πρόσβαση σε παράγωγα μαθήματα και σε τάξεις / λειτουργίες φίλων .
Χρειαζόμαστε protected
μέλη εάν θέλουμε να αποκρύψουμε τα δεδομένα μιας κλάσης, αλλά εξακολουθούμε να θέλουμε αυτά τα δεδομένα να κληρονομηθούν από τις παράγωγες τάξεις της.
Για να μάθετε περισσότερα σχετικά με τα προστατευόμενα, ανατρέξτε στο μάθημα τροποποιητών πρόσβασης C ++
Παράδειγμα 2: Μέλη που προστατεύονται από C ++
// C++ program to demonstrate protected members #include #include using namespace std; // base class class Animal ( private: string color; protected: string type; public: void eat() ( cout << "I can eat!" << endl; ) void sleep() ( cout << "I can sleep!" << endl; ) void setColor(string clr) ( color = clr; ) string getColor() ( return color; ) ); // derived class class Dog : public Animal ( public: void setType(string tp) ( type = tp; ) void displayInfo(string c) ( cout << "I am a " << type << endl; cout << "My color is " << c << endl; ) void bark() ( cout << "I can bark! Woof woof!!" << endl; ) ); int main() ( // Create object of the Dog class Dog dog1; // Calling members of the base class dog1.eat(); dog1.sleep(); dog1.setColor("black"); // Calling member of the derived class dog1.bark(); dog1.setType("mammal"); // Using getColor() of dog1 as argument // getColor() returns string data dog1.displayInfo(dog1.getColor()); return 0; )
Παραγωγή
Μπορώ να φάω! Μπορώ να κοιμηθώ! Μπορώ να γαβγίσω! ΓΑΒ ΓΑΒ!! Είμαι θηλαστικό Το χρώμα μου είναι μαύρο
Εδώ, ο μεταβλητός τύπος είναι protected
και είναι επομένως προσβάσιμος από την παράγωγη κλάση Dog
. Μπορούμε να το δούμε καθώς αρχικοποιήσαμε type
στην Dog
τάξη χρησιμοποιώντας τη συνάρτηση setType()
.
Από την άλλη πλευρά, το private
μεταβλητό χρώμα δεν μπορεί να αρχικοποιηθεί στο Dog
.
class Dog : public Animal ( public: void setColor(string clr) ( // Error: member "Animal::color" is inaccessible color = clr; ) );
Επίσης, δεδομένου ότι η protected
λέξη-κλειδί αποκρύπτει δεδομένα, δεν μπορούμε να έχουμε πρόσβαση στον τύπο απευθείας από ένα αντικείμενο Dog
ή Animal
κατηγορία
// Error: member "Animal::type" is inaccessible dog1.type = "mammal";
Πρόσβαση στις λειτουργίες C ++ Inheritance
Στα προηγούμενα μαθήματά μας, μάθαμε για τους προσδιοριστές πρόσβασης C ++ όπως δημόσιο, ιδιωτικό και προστατευμένο.
Μέχρι στιγμής, έχουμε χρησιμοποιήσει τη public
λέξη-κλειδί για να κληρονομήσουμε μια τάξη από μια προϋπάρχουσα βασική τάξη. Ωστόσο, μπορούμε επίσης να χρησιμοποιήσουμε τις λέξεις-κλειδιά private
και protected
για να κληρονομήσουμε τάξεις. Για παράδειγμα,
class Animal ( // code ); class Dog : private Animal ( // code );
class Cat : protected Animal ( // code );
Οι διάφοροι τρόποι που μπορούμε να αντλήσουμε τάξεις είναι γνωστοί ως τρόποι πρόσβασης . Αυτοί οι τρόποι πρόσβασης έχουν το ακόλουθο αποτέλεσμα:
- δημόσιο: Εάν μια παράγωγη κλάση δηλώνεται σε
public
κατάσταση λειτουργίας, τότε τα μέλη της βασικής τάξης κληρονομούνται από την παράγωγη τάξη όπως είναι. - ιδιωτικό: Σε αυτήν την περίπτωση, όλα τα μέλη της βασικής τάξης γίνονται
private
μέλη στην παράγωγη τάξη. - προστατευμένο: Τα
public
μέλη της βασικής τάξης γίνονταιprotected
μέλη στην παράγωγη τάξη.
Τα private
μέλη της βασικής τάξης είναι πάντα private
στην παράγωγη τάξη.
Για να μάθετε περισσότερα, επισκεφτείτε το δημόσιο, ιδιωτικό, προστατευμένο σεμινάριο κληρονομιάς του C ++.
Αντικατάσταση της λειτουργίας μέλους στην κληρονομικότητα
Ας υποθέσουμε ότι η βασική τάξη και η παράγωγη κλάση έχουν συναρτήσεις μέλους με το ίδιο όνομα και επιχειρήματα.
Εάν δημιουργήσουμε ένα αντικείμενο της παραγόμενης κλάσης και προσπαθήσουμε να αποκτήσουμε πρόσβαση σε αυτήν τη συνάρτηση μέλους, η συνάρτηση μέλους στην παράγωγη κλάση γίνεται αντί της μίας στην βασική κλάση.
Η συνάρτηση μέλους της προερχόμενης κλάσης παρακάμπτει τη συνάρτηση μέλους της κατηγορίας βάσης.
Μάθετε περισσότερα σχετικά με την παράκαμψη της λειτουργίας στο C ++.
Προτεινόμενη ανάγνωση: Πολλαπλή κληρονομικότητα C ++