C ++ Πολυμορφισμός με Παράδειγμα

Πίνακας περιεχομένων:

Anonim

Τι είναι ο πολυμορφισμός στο C ++;

Στο C ++, ο πολυμορφισμός προκαλεί τη λειτουργία ενός μέλους να συμπεριφέρεται διαφορετικά με βάση το αντικείμενο που το καλεί / επικαλείται. Ο πολυμορφισμός είναι μια ελληνική λέξη που σημαίνει ότι έχει πολλές μορφές. Εμφανίζεται όταν έχετε μια ιεραρχία τάξεων που σχετίζονται με την κληρονομιά.

Για παράδειγμα, ας υποθέσουμε ότι έχουμε τη συνάρτηση makeSound (). Όταν μια γάτα καλεί αυτή τη λειτουργία, θα παράγει τον ήχο του νιαούρου. Όταν μια αγελάδα επικαλεστεί την ίδια λειτουργία, θα παρέχει τον ήχο Moow.

Αν και έχουμε μια λειτουργία, συμπεριφέρεται διαφορετικά υπό διαφορετικές συνθήκες. Η συνάρτηση έχει πολλές μορφές. Ως εκ τούτου, έχουμε επιτύχει πολυμορφισμό.

Σε αυτό το σεμινάριο C ++, θα μάθετε:

  • Τι είναι ο πολυμορφισμός;
  • Τύποι πολυμορφισμού
  • Μεταγλώττιση πολυμορφισμού χρόνου
  • Υπερφόρτωση λειτουργίας
  • Υπερφόρτωση χειριστή
  • Πολυμορφισμός χρόνου εκτέλεσης
  • Παράκαμψη λειτουργίας
  • Εικονική συνάρτηση C ++
  • Compile-Time Polymorphism εναντίον Πολυμορφισμός χρόνου εκτέλεσης

Τύποι πολυμορφισμού

Το C ++ υποστηρίζει δύο τύπους πολυμορφισμού:

  • Πολυμορφισμός χρόνου μεταγλώττισης, και
  • Πολυμορφισμός χρόνου εκτέλεσης.

Μεταγλώττιση πολυμορφισμού χρόνου

Επικαλούμετε τις υπερφορτωμένες συναρτήσεις αντιστοιχίζοντας τον αριθμό και τον τύπο των ορισμάτων. Οι πληροφορίες υπάρχουν κατά τη διάρκεια της μεταγλώττισης Αυτό σημαίνει ότι ο μεταγλωττιστής C ++ θα επιλέξει τη σωστή λειτουργία τη στιγμή της μεταγλώττισης.

Ο πολυμορφισμός χρόνου μεταγλώττισης επιτυγχάνεται μέσω υπερφόρτωσης λειτουργίας και υπερφόρτωσης χειριστή.

Υπερφόρτωση λειτουργίας

Η υπερφόρτωση συναρτήσεων συμβαίνει όταν έχουμε πολλές συναρτήσεις με παρόμοια ονόματα αλλά διαφορετικά ορίσματα. Τα επιχειρήματα ενδέχεται να διαφέρουν ως προς τον αριθμό ή τον τύπο.

Παράδειγμα 1:

#include using namespace std;void test(int i) {cout << " The int is " << i << endl;}void test(double f) {cout << " The float is " << f << endl;}void test(char const *ch) {cout << " The char* is " << ch << endl;}int main() {test(5);test(5.5);test("five");return 0;}

Παραγωγή:

Ακολουθεί ένα στιγμιότυπο οθόνης του κώδικα:

Επεξήγηση κώδικα:

  1. Συμπεριλάβετε το αρχείο κεφαλίδας iostream στον κώδικά μας. Θα είμαστε σε θέση να χρησιμοποιήσουμε τις λειτουργίες του.
  2. Συμπεριλάβετε το χώρο ονομάτων std στον κώδικά μας. Θα μπορέσουμε να χρησιμοποιήσουμε τα μαθήματά του χωρίς να το καλέσουμε.
  3. Δημιουργήστε μια συνάρτηση με το όνομα test που παίρνει μια ακέραια παράμετρο i. Το {σηματοδοτεί την αρχή του τεστ λειτουργίας σώματος.
  4. Δήλωση που πρέπει να εκτελεστεί εάν γίνει κλήση / κλήση του παραπάνω τεστ λειτουργίας.
  5. Τέλος του σώματος της παραπάνω δοκιμής λειτουργίας.
  6. Δημιουργήστε μια συνάρτηση με το όνομα test που παίρνει μια παράμετρο float f. Το {σηματοδοτεί την αρχή του σώματος της δοκιμής λειτουργίας.
  7. Δήλωση που πρέπει να εκτελεστεί εάν γίνει κλήση / κλήση του παραπάνω τεστ λειτουργίας.
  8. Τέλος του σώματος της παραπάνω δοκιμής λειτουργίας.
  9. Δημιουργήστε μια συνάρτηση με το όνομα test που παίρνει μια παράμετρο χαρακτήρα ch. Το {σηματοδοτεί την αρχή του σώματος της δοκιμής λειτουργίας.
  10. Δήλωση που πρέπει να εκτελεστεί εάν γίνει κλήση / κλήση του παραπάνω τεστ λειτουργίας.
  11. Τέλος του σώματος της παραπάνω δοκιμής λειτουργίας.
  12. Καλέστε την κύρια λειτουργία (). Το {σηματοδοτεί την αρχή του σώματος της συνάρτησης.
  13. Καλέστε τη δοκιμή συνάρτησης και περάστε 5 σε αυτήν ως την τιμή του ορίσματος. Αυτό επικαλείται τη συνάρτηση δοκιμής που δέχεται ένα ακέραιο όρισμα, δηλαδή την πρώτη συνάρτηση δοκιμής.
  14. Καλέστε τη δοκιμή συνάρτησης και περάστε 5,5 σε αυτήν ως την τιμή του ορίσματος. Αυτό θα επικαλεστεί τη δοκιμαστική συνάρτηση που δέχεται ένα όρισμα float, δηλαδή τη δεύτερη συνάρτηση δοκιμής.
  15. Καλέστε τη δοκιμή συνάρτησης και περάστε πέντε σε αυτήν ως την τιμή του ορίσματος. Αυτό θα επικαλεστεί τη συνάρτηση δοκιμής που δέχεται ένα όρισμα χαρακτήρα, δηλαδή την τρίτη συνάρτηση δοκιμής.
  16. Το πρόγραμμα πρέπει να επιστρέψει μια τιμή εάν εκτελείται με επιτυχία.
  17. Το τέλος του σώματος της κύριας () συνάρτησης.

Έχουμε τρεις συναρτήσεις με το ίδιο όνομα αλλά διαφορετικούς τύπους ορισμάτων. Έχουμε επιτύχει πολυμορφισμό.

Υπερφόρτωση χειριστή

Στο Operator Overloading, ορίζουμε ένα νέο νόημα για έναν χειριστή C ++. Αλλάζει επίσης τον τρόπο λειτουργίας του χειριστή. Για παράδειγμα, μπορούμε να ορίσουμε τον τελεστή + για να συνδυάσουμε δύο χορδές. Το γνωρίζουμε ως το χειριστή προσθήκης για την προσθήκη αριθμητικών τιμών. Μετά τον ορισμό μας, όταν τοποθετούνται μεταξύ ακέραιων, θα τους προσθέσει. Όταν τοποθετείται ανάμεσα σε χορδές, θα τις συνδυάζει.

Παράδειγμα 2:

#includeusing namespace std;class ComplexNum {private:int real, over;public:ComplexNum(int rl = 0, int ov = 0) {real = rl;over = ov;}ComplexNum operator + (ComplexNum const &obj) {ComplexNum result;result.real = real + obj.real;result.over = over + obj.over;return result;}void print() {cout << real << " + i" << over << endl;}};int main(){ComplexNum c1(10, 2), c2(3, 7);ComplexNum c3 = c1+c2;c3.print();}

Παραγωγή:

Ακολουθεί ένα στιγμιότυπο οθόνης του κώδικα:

Επεξήγηση κώδικα:

  1. Συμπεριλάβετε το αρχείο κεφαλίδας iostream στο πρόγραμμά μας για να χρησιμοποιήσετε τις λειτουργίες του.
  2. Συμπεριλάβετε το std namespace στο πρόγραμμά μας για να χρησιμοποιήσετε τις τάξεις του χωρίς να το καλέσετε.
  3. Δημιουργήστε μια τάξη με το όνομα ComplexNum. Το {σηματοδοτεί την αρχή του σώματος της τάξης.
  4. Χρησιμοποιήστε τον τροποποιητή ιδιωτικής πρόσβασης για να επισημάνετε τις μεταβλητές ως ιδιωτικές, που σημαίνει ότι είναι προσβάσιμες μόνο από την τάξη.
  5. Ορίστε δύο ακέραιες μεταβλητές, πραγματικές και πάνω.
  6. Χρησιμοποιήστε τον τροποποιητή δημόσιας πρόσβασης για να επισημάνετε τον κατασκευαστή ως δημόσιο, πράγμα που σημαίνει ότι θα είναι προσβάσιμος ακόμη και εκτός της τάξης.
  7. Δημιουργήστε τον κατασκευαστή τάξης και αρχικοποιώντας τις μεταβλητές.
  8. Αρχικοποιήστε την τιμή της πραγματικής μεταβλητής.
  9. Αρχικοποιήστε την τιμή της μεταβλητής over.
  10. Άκρο του κατασκευαστή.
  11. Πρέπει να παρακάμψουμε την έννοια του τελεστή +.
  12. Δημιουργήστε το αποτέλεσμα τύπου δεδομένων του τύπου ComplexNum.
  13. Χρησιμοποιήστε τον τελεστή + με σύνθετους αριθμούς. Αυτή η γραμμή θα προσθέσει το πραγματικό μέρος ενός αριθμού στο πραγματικό μέρος ενός άλλου αριθμού.
  14. Χρησιμοποιήστε τον τελεστή + με σύνθετους αριθμούς. Αυτή η γραμμή θα προσθέσει το φανταστικό μέρος ενός αριθμού στο φανταστικό μέρος ενός άλλου αριθμού.
  15. Το πρόγραμμα θα επιστρέψει την τιμή του μεταβλητού αποτελέσματος κατά την επιτυχή εκτέλεση.
  16. Τέλος του ορισμού της νέας έννοιας του + χειριστή, δηλαδή υπερφόρτωση.
  17. Καλέστε τη μέθοδο εκτύπωσης ().
  18. Εκτυπώστε το νέο σύνθετο αριθμό μετά την προσθήκη στην κονσόλα.
  19. Λειτουργία στο τέλος του σώματος εκτύπωσης ().
  20. Τέλος του σώματος της κατηγορίας ComplexNum.
  21. Καλέστε την κύρια λειτουργία ().
  22. Περάστε τις τιμές τόσο των πραγματικών όσο και των σύνθετων μερών που θα προστεθούν. Το πρώτο μέρος του c1 θα προστεθεί στο πρώτο μέρος του c2, δηλαδή 10 + 3. Το δεύτερο μέρος του c1 θα προστεθεί στο δεύτερο μέρος του c, δηλαδή 2 + 7.
  23. Εκτελέστε μια λειτουργία χρησιμοποιώντας τον υπερφορτωμένο χειριστή + και αποθηκεύστε το αποτέλεσμα στη μεταβλητή c3.
  24. Εκτυπώστε την τιμή της μεταβλητής c3 στην κονσόλα.
  25. Τέλος του σώματος της κύριας () λειτουργίας.

Πολυμορφισμός χρόνου εκτέλεσης

Αυτό συμβαίνει όταν η μέθοδος ενός αντικειμένου καλείται / καλείται κατά τη διάρκεια του χρόνου εκτέλεσης και όχι κατά το χρόνο μεταγλώττισης. Ο πολυμορφισμός χρόνου εκτέλεσης επιτυγχάνεται μέσω της παράκαμψης της λειτουργίας. Η συνάρτηση προς κλήση / επίκληση καθορίζεται κατά τη διάρκεια του χρόνου εκτέλεσης.

Παράκαμψη λειτουργίας

Η παράκαμψη της λειτουργίας εμφανίζεται όταν μια συνάρτηση της βασικής κλάσης έχει έναν νέο ορισμό σε μια παράγωγη κλάση. Εκείνη τη στιγμή, μπορούμε να πούμε ότι η συνάρτηση βάσης έχει παρακαμφθεί.

Για παράδειγμα:

#include using namespace std;class Mammal {public:void eat() {cout << "Mammals eat… ";}};class Cow: public Mammal {public:void eat() {cout << "Cows eat grass… ";}};int main(void) {Cow c = Cow();c.eat();return 0;}

Παραγωγή:

Ακολουθεί ένα στιγμιότυπο οθόνης του κώδικα:

Επεξήγηση κώδικα:

  1. Εισαγάγετε το αρχείο κεφαλίδας iostream στο πρόγραμμά μας για να χρησιμοποιήσετε τις λειτουργίες του.
  2. Συμπεριλάβετε το std namespace στο πρόγραμμά μας για να χρησιμοποιήσετε τις τάξεις του χωρίς να το καλέσετε.
  3. Δημιουργήστε μια τάξη με το όνομα Mammal. Το {σηματοδοτεί την αρχή του σώματος της τάξης.
  4. Χρησιμοποιήστε τον τροποποιητή δημόσιας πρόσβασης για να ορίσετε τη λειτουργία που πρόκειται να δημιουργήσουμε ως δημόσια προσβάσιμη. Θα είναι προσβάσιμο από έξω από αυτήν την τάξη.
  5. Δημιουργήστε μια δημόσια λειτουργία που ονομάζεται eat. Το {σηματοδοτεί την αρχή του σώματος λειτουργίας.
  6. Εκτυπώστε τη δήλωση που προστέθηκε στη συνάρτηση cout όταν καλείται η συνάρτηση eat ().
  7. Το τέλος του σώματος της λειτουργίας τρώει ().
  8. Τέλος του σώματος της τάξης Θηλαστικό.
  9. Δημιουργήστε μια τάξη με όνομα Cow που κληρονομεί την τάξη των θηλαστικών. Η αγελάδα είναι η παράγωγη τάξη, ενώ η θηλαστική είναι η βασική τάξη. Το {σηματοδοτεί την αρχή αυτής της τάξης.
  10. Χρησιμοποιήστε τον τροποποιητή δημόσιας πρόσβασης για να επισημάνετε τη λειτουργία που πρόκειται να δημιουργήσουμε ως δημόσια προσβάσιμη. Θα είναι προσβάσιμο από έξω από αυτήν την τάξη.
  11. Παράκαμψη της συνάρτησης eat () που ορίστηκε στην κατηγορία βάσης. Το {σηματοδοτεί την αρχή του σώματος λειτουργίας.
  12. Η δήλωση για εκτύπωση στην κονσόλα όταν ενεργοποιείται αυτή η λειτουργία.
  13. Τέλος του σώματος της συνάρτησης φάει ().
  14. Τέλος του σώματος της κατηγορίας Αγελάδα.
  15. Καλέστε την κύρια λειτουργία (). Το {σηματοδοτεί την αρχή του σώματος αυτής της συνάρτησης.
  16. Δημιουργήστε μια παρουσία της κατηγορίας Cow και δώστε της το όνομα c.
  17. Καλέστε τη συνάρτηση eat () που ορίζεται στην κατηγορία Cow.
  18. Το πρόγραμμα πρέπει να επιστρέψει μια τιμή μετά την επιτυχή ολοκλήρωση.
  19. Τέλος της κύριας συνάρτησης ().

Εικονική συνάρτηση C ++

Μια εικονική συνάρτηση είναι ένας άλλος τρόπος εφαρμογής πολυμορφισμού χρόνου εκτέλεσης στο C ++. Είναι μια ειδική συνάρτηση που ορίζεται σε μια βασική τάξη και επαναπροσδιορίζεται στην παράγωγη τάξη. Για να δηλώσετε μια εικονική συνάρτηση, θα πρέπει να χρησιμοποιήσετε την εικονική λέξη-κλειδί. Η λέξη-κλειδί πρέπει να προηγείται της δήλωσης της συνάρτησης στην βασική κλάση.

Εάν κληρονομείται μια κλάση εικονικής λειτουργίας, η εικονική κλάση επαναπροσδιορίζει την εικονική συνάρτηση ώστε να ανταποκρίνεται στις ανάγκες της. Για παράδειγμα:

#include using namespace std;class ClassA {public:virtual void show() {cout << "The show() function in base class invoked… " << endl;}};class ClassB :public ClassA {public:void show() {cout << "The show() function in derived class invoked… ";}};int main() {ClassA* a;ClassB b;a = &b;a->show();}

Παραγωγή:

Ακολουθεί ένα στιγμιότυπο οθόνης του κώδικα:

Επεξήγηση κώδικα:

  1. Συμπεριλάβετε το αρχείο κεφαλίδας iostream στον κώδικα για να χρησιμοποιήσετε τις λειτουργίες του.
  2. Συμπεριλάβετε τον χώρο ονομάτων std στον κώδικά μας για να χρησιμοποιήσετε τις κλάσεις του χωρίς να το καλέσετε.
  3. Δημιουργήστε μια τάξη με το όνομα ClassA.
  4. Χρησιμοποιήστε τον τροποποιητή δημόσιας πρόσβασης για να επισημάνετε ένα μέλος της τάξης ως προσβάσιμο στο κοινό.
  5. Δημιουργήστε μια εικονική συνάρτηση με το όνομα show (). Θα είναι μια δημόσια λειτουργία.
  6. Το κείμενο που θα εκτυπωθεί όταν γίνεται επίκληση της εκπομπής (). Το endl είναι μια λέξη-κλειδί C ++, που σημαίνει τελική γραμμή. Μετακινεί το δρομέα του ποντικιού στην επόμενη γραμμή.
  7. Τέλος του σώματος της εικονικής συνάρτησης ().
  8. Τέλος του σώματος της τάξης ClassA.
  9. Δημιουργία νέας τάξης με την ονομασία ClassB που κληρονομεί την κλάση ClassA. Το ClassA γίνεται η βασική κατηγορία ενώ το ClassB γίνεται η παράγωγη κλάση.
  10. Χρησιμοποιήστε τον τροποποιητή δημόσιας πρόσβασης για να επισημάνετε ένα μέλος της τάξης ως προσβάσιμο στο κοινό.
  11. Επαναπροσδιορίστε την εμφάνιση εικονικής λειτουργίας () που προέρχεται στην βασική κλάση.
  12. Το κείμενο που θα εκτυπωθεί στην κονσόλα όταν καλείται η συνάρτηση show () που ορίζεται στην κλάση που προέρχεται.
  13. Λήξη του σώματος της παράστασης ().
  14. Τέλος του σώματος της παραγόμενης κλάσης, ClassB.
  15. Καλέστε την κύρια λειτουργία (). Η λογική του προγράμματος πρέπει να προστεθεί στο σώμα του.
  16. Δημιουργήστε μια μεταβλητή δείκτη με το όνομα a. Δείχνει την τάξη που ονομάζεται ClassA.
  17. Δημιουργήστε μια παρουσία της κλάσης με το όνομα ClassB. Στην περίπτωση δίνεται το όνομα β.
  18. Αντιστοιχίστε τις τιμές αποθήκευσης στη διεύθυνση b στη μεταβλητή a.
  19. Επικαλέστε τη συνάρτηση show () που ορίζεται στην παράγωγη κλάση Η καθυστερημένη δέσμευση έχει εφαρμοστεί.
  20. Τέλος του σώματος της κύριας () συνάρτησης.

Compile-Time Polymorphism εναντίον Πολυμορφισμός χρόνου εκτέλεσης

Εδώ είναι οι σημαντικές διαφορές μεταξύ των δύο:

Πολυμορφισμός μεταγλώττισης Πολυμορφισμός χρόνου εκτέλεσης
Ονομάζεται επίσης πρώιμη δέσμευση ή στατικός πολυμορφισμός Ονομάζεται επίσης καθυστερημένη / δυναμική σύνδεση ή δυναμικός πολυμορφισμός
Η μέθοδος καλείται / καλείται κατά τη διάρκεια της μεταγλώττισης Η μέθοδος καλείται / καλείται κατά το χρόνο εκτέλεσης
Υλοποιείται μέσω υπερφόρτωσης λειτουργίας και υπερφόρτωσης χειριστή Υλοποιείται μέσω μεθόδου παράκαμψης και εικονικών συναρτήσεων
Παράδειγμα, μέθοδος υπερφόρτωσης. Πολλές μέθοδοι μπορεί να έχουν παρόμοια ονόματα αλλά διαφορετικό αριθμό ή τύπους ορισμάτων Παράδειγμα, παράκαμψη μεθόδου. Πολλές μέθοδοι μπορεί να έχουν παρόμοιο όνομα και το ίδιο πρωτότυπο.
Ταχύτερη εκτέλεση δεδομένου ότι η ανακάλυψη μεθόδων γίνεται κατά τη διάρκεια της μεταγλώττισης Αργότερη εκτέλεση δεδομένου ότι η ανακάλυψη μεθόδου γίνεται κατά τη διάρκεια του χρόνου εκτέλεσης.
Παρέχεται λιγότερη ευελιξία για την επίλυση προβλημάτων, καθώς όλα είναι γνωστά κατά τη διάρκεια της σύνταξης. Μεγάλη ευελιξία παρέχεται για την επίλυση πολύπλοκων προβλημάτων, καθώς οι μέθοδοι ανακαλύπτονται κατά τη διάρκεια του χρόνου εκτέλεσης.

Περίληψη:

  • Ο πολυμορφισμός σημαίνει να έχουμε πολλές μορφές.
  • Εμφανίζεται όταν υπάρχει μια ιεραρχία τάξεων που σχετίζονται με την κληρονομιά.
  • Με τον πολυμορφισμό, μια συνάρτηση μπορεί να συμπεριφέρεται διαφορετικά με βάση το αντικείμενο που το καλεί / καλεί.
  • Στον πολυμορφισμό του χρόνου μεταγλώττισης, η συνάρτηση προς επίκληση καθορίζεται κατά τη διάρκεια του χρόνου μεταγλώττισης.
  • Στον πολυμορφισμό του χρόνου εκτέλεσης, η συνάρτηση που επικαλείται καθορίζεται κατά τη διάρκεια του χρόνου εκτέλεσης.
  • Ο πολυμορφισμός χρόνου μεταγλώττισης προσδιορίζεται μέσω υπερφόρτωσης λειτουργίας και υπερφόρτωσης χειριστή.
  • Στην υπερφόρτωση συναρτήσεων, υπάρχουν πολλές συναρτήσεις με παρόμοια ονόματα αλλά διαφορετικά ορίσματα.
  • Οι παράμετροι μπορεί να διαφέρουν σε αριθμό ή τύπο.
  • Στην υπερφόρτωση χειριστή, ορίζεται ένα νέο νόημα για τους χειριστές C ++.
  • Ο πολυμορφισμός χρόνου εκτέλεσης επιτυγχάνεται μέσω της παράκαμψης της λειτουργίας.
  • Στην παράκαμψη συνάρτησης, μια παράγωγη κλάση δίνει έναν νέο ορισμό σε μια συνάρτηση που ορίζεται στην βασική τάξη.