Περαιτέρω, μελετάμε τη διαφορά μεταξύ υπερφόρτωσης και υπέρβασης με τη βοήθεια ενός πίνακα σύγκρισης.
Συγκριτικό διάγραμμα:
Βάση σύγκρισης | Υπερφόρτωση | Υπέρβαση |
---|---|---|
Πρωτότυπο | Ο πρωτότυπος διαφέρει καθώς ο αριθμός ή ο τύπος της παραμέτρου μπορεί να διαφέρουν. | Όλες οι όψεις του πρωτοτύπου πρέπει να είναι ίδιες. |
Λέξη κλειδί | Καμία λέξη-κλειδί δεν εφαρμόστηκε κατά την υπερφόρτωση. | Η λειτουργία που πρέπει να αντικατασταθεί προηγείται από τη λέξη «εικονική», στην κατηγορία βάσης. |
Διακριτικός παράγοντας | Ο αριθμός ή ο τύπος της παραμέτρου διαφέρει, πράγμα που καθορίζει την εκδοχή της λειτουργίας που καλείται. | Η λειτουργία της οποιασδήποτε κλάσης ονομάζεται από τον δείκτη, καθορίζεται από τη διεύθυνση του αντικειμένου της κλάσης που αντιστοιχεί στον δείκτη. |
Ορισμός προτύπου | Οι λειτουργίες επαναπροσδιορίζονται με το ίδιο όνομα, αλλά με διαφορετικό αριθμό και τύπο παραμέτρου. | Λειτουργία ορίζεται, που προηγείται από μια λέξη-κλειδί 'εικονική' στην κύρια κλάση και επαναπροσδιορίζεται από παράγωγη κλάση με λέξη-κλειδί έξω. |
Ώρα ολοκλήρωσης | Χρόνος σύνταξης. | Εκτελέστε χρόνο. |
Κατασκευαστής / εικονική λειτουργία | Οι κατασκευαστές μπορούν να υπερφορτωθούν. | Η εικονική λειτουργία μπορεί να αντικατασταθεί. |
Καταστροφέας | Ο καταστροφέας δεν μπορεί να υπερφορτωθεί. | Ο καταστροφέας μπορεί να αντικατασταθεί. |
Δεσμευτικός | Η υπερφόρτωση επιτυγχάνει έγκαιρη δέσμευση. | Η απαγόρευση αναφέρεται στην καθυστερημένη σύνδεση. |
Ορισμός της υπερφόρτωσης
Ο πολύμορφος συνδυασμός χρόνου ονομάζεται «υπερφόρτωση». Καθώς η υπερφόρτωση δημιουργείται από μια έννοια πολυμορφισμού, παρέχει μια "κοινή διεπαφή για πολλαπλές μεθόδους". Αυτό σημαίνει ότι, αν μια λειτουργία είναι υπερφορτωμένη, περιέχει το ίδιο όνομα λειτουργίας, ενώ επαναπροσδιορίζεται.
Οι υπερφορτωμένες λειτουργίες διαφέρουν σε σχέση με τον διαφορετικό αριθμό ή τον τύπο των παραμέτρων, καθιστώντας μια λειτουργία υπερφόρτωσης διαφορετική από την άλλη. Με αυτό τον τρόπο, ο μεταγλωττιστής αναγνωρίζει ποια υπερφορτωμένη λειτουργία καλείται. Οι πιο συχνά υπερφορτωμένες λειτουργίες είναι οι «κατασκευαστές». Ο «κατασκευαστής αντιγράφων» είναι ένα είδος "υπερφόρτωσης κατασκευαστή".
Υλοποίηση υπερφορτώσεων σε C ++
τάξη υπερφόρτωσης {int a, b; δημόσιο: int φορτίο (int x) {// πρώτη φόρτιση () συνάρτηση a = x; επιστροφή a; } int φορτίο (int x, int y) {// δεύτερη φόρτιση () συνάρτηση a = x; b = y; επιστροφή a * b; }}. int main () {υπερφόρτιση O1; O1.load (20). // πρώτη φόρτωση () κλήση λειτουργίας O1.load (20, 40); // κλήση λειτουργίας δεύτερης φόρτωσης ()}
Εδώ φορτίο λειτουργίας () της υπερφόρτωσης κλάσης έχει υπερφορτωθεί. Οι δύο υπερφορτωμένες λειτουργίες της κλάσης μπορούν να διακριθούν με τρόπο που η συνάρτηση πρώτου φορτίου () δέχεται μόνο μία μοναδιαία παράμετρο, ενώ η δεύτερη συνάρτηση φορτίου () δέχεται δύο ακέραιες παραμέτρους. Όταν το αντικείμενο της υπερφόρτωσης κλάσης καλεί τη λειτουργία load () με μία μόνο παράμετρο, τότε καλείται η πρώτη φόρτιση (). Όταν το αντικείμενο φορτώνει τη συνάρτηση load () που διέρχεται από δύο παραμέτρους, καλείται η δεύτερη συνάρτηση load ().
Ορισμός της απαγόρευσης
Ο πολυμορφισμός που επιτυγχάνεται κατά τη διάρκεια του χρόνου εκτέλεσης ονομάζεται «υπερισχύει». Αυτό επιτυγχάνεται με τη χρήση "κληρονομιάς" και "εικονικών λειτουργιών". Η λειτουργία που πρέπει να αντικατασταθεί προηγείται από τη λέξη-κλειδί 'εικονική' σε μια κλάση βάσης και επαναπροσδιορίζεται σε παράγωγη κλάση χωρίς λέξη-κλειδί.
Ένα από τα σημαντικότερα πράγματα που πρέπει να θυμόμαστε σε περίπτωση επικρίσεων είναι ότι το πρωτότυπο της υπερτιμημένης συνάρτησης δεν πρέπει να αλλάζει, ενώ η παράγωγη κλάση την επαναπροσδιορίζει. Όταν δίνεται μια κλήση στην υπερτιμημένη λειτουργία, η C ++ καθορίζει ποια έκδοση της συνάρτησης καλείται βάσει του «τύπου του αντικειμένου που υποδεικνύεται από έναν δείκτη» με τον οποίο γίνεται η κλήση λειτουργίας.
Εφαρμογή της Υπέρβασης σε C ++
class class {public: virtual void funct () {// εικονική λειτουργία της βασικής κλάσης cout << "Αυτή είναι η funct () της βασικής κλάσης"; }}. class derived1: δημόσια βάση {public: void funct () {// εικονική συνάρτηση της κλάσης βάσης επανακαθορισμένη στην derived1 class cout << "Αυτή είναι η funct () της derived1 της κατηγορίας"; }}. class derived2: δημόσια βάση {public: void funct () {// εικονική συνάρτηση της κλάσης βάσης επανακαθορισμένη στην κλάση derived2 classfunct (); // κλήση προς derived1 κλάση funct (). * p = & d2. p-> funct (); // κλήση σε κλάση derived2 (). επιστροφή 0? }}
Εδώ, υπάρχει μια ενιαία κλάση βάσης η οποία κληρονομείται δημοσίως από δύο παράγωγες κλάσεις. Μια εικονική συνάρτηση ορίζεται σε μια βασική κλάση με μια λέξη-κλειδί «εικονική» και επαναπροσδιορίζεται και από τις παράγωγες κλάσεις χωρίς λέξη-κλειδί. Στην κύρια (), η βασική κλάση δημιουργεί μια μεταβλητή δείκτη 'p' και ένα αντικείμενο 'b'. Η κλάση 'derived1' δημιουργεί ένα αντικείμενο d1 και η κλάση derived2 δημιουργεί ένα αντικείμενο d2 '.
Τώρα, αρχικά η διεύθυνση του αντικειμένου της κατηγορίας βάσης 'b' αντιστοιχεί στον δείκτη της βασικής κλάσης 'p'. 'p' δίνει μια κλήση στη λειτουργία funct (), έτσι καλείται μια συνάρτηση της κλάσης βάσης. Στη συνέχεια, η διεύθυνση του παραγόμενου αντικειμένου τάξης 'd1' έχει εκχωρηθεί στο pointer 'p', και πάλι δίνει call to funct (); εδώ εκτελείται η λειτουργία funct () της κλάσης derived1. Τέλος, ο δείκτης 'p' εκχωρείται στο αντικείμενο της κλάσης derived2. Στη συνέχεια, η κλήση 'p' λειτουργεί funct () που εκτελεί τη λειτουργία func () της κλάσης derived2.
Αν η κλάση derived1 / derived2 δεν επαναπροσδιορίσει το funct (), τότε θα πρέπει να ονομάζεται το funct () της βασικής κλάσης, καθώς η εικονική συνάρτηση είναι 'ιεραρχική'.
Βασικές διαφορές μεταξύ υπερφόρτωσης και υπέρβασης
- Το πρωτότυπο μιας συνάρτησης που είναι υπερφορτωμένο διαφέρει λόγω του τύπου και του αριθμού των παραμέτρων που μεταβιβάζονται στη λειτουργία υπερφόρτωσης. Από την άλλη πλευρά, το πρωτότυπο της υπερτιμημένης συνάρτησης δεν αλλάζει επειδή μια υπερτιμημένη συνάρτηση εκτελεί διαφορετική ενέργεια για διαφορετική κλάση ανήκει αλλά με τον ίδιο τύπο και τον ίδιο αριθμό παραμέτρων.
- Το όνομα της υπερφορτωμένης συνάρτησης δεν προηγείται με οποιαδήποτε λέξη-κλειδί ενώ το όνομα μιας υπαινιγμένης λειτουργίας προηγείται με το πλήκτρο "Εικονικό" μόνο στη βασική κλάση.
- Η οποία επικαλούμενη συνάρτηση υπερφόρτωσης εξαρτάται από τον τύπο ή τον αριθμό της παραμέτρου που μεταβιβάζεται στη λειτουργία. Η υπέρβαση της συνάρτησης της κατηγορίας που επικαλείται εξαρτάται από το ποια διεύθυνση αντικειμένου τάξης έχει εκχωρηθεί στον δείκτη, ο οποίος επικαλείται τη λειτουργία.
- Η οποία υπερφορτωμένη λειτουργία πρέπει να ενεργοποιηθεί, επιλύεται κατά τη διάρκεια της μεταγλώττισης. Ποια επαλληφθείσα συνάρτηση που πρέπει να επικαλεσθεί επιλυθεί κατά τη διάρκεια του χρόνου εκτέλεσης.
- Οι κατασκευαστές μπορούν να υπερφορτωθούν αλλά δεν μπορούν να αντικατασταθούν.
- Οι καταστροφείς δεν μπορούν να υπερφορτωθούν, αλλά μπορούν να αντικατασταθούν.
- Η υπερφόρτωση επιτυγχάνει την έγκαιρη δέσμευση ως προς την οποία θα καλείται η υπερφορτωμένη λειτουργία, επιλύεται κατά τη διάρκεια της μεταγλώττισης. Η παράκαμψη επιτυγχάνει την καθυστερημένη σύνδεση καθώς η λειτουργία που θα αντικατασταθεί θα επιλυθεί κατά τη διάρκεια του χρόνου εκτέλεσης.
Ομοιότητες
- Και οι δύο εφαρμόζονται στις λειτουργίες μελών μιας τάξης.
- Ο πολυμορφισμός είναι η βασική ιδέα πίσω από τα δύο.
- Το όνομα της λειτουργίας παραμένει το ίδιο, ενώ εφαρμόζουμε υπερφόρτωση και υπερισχύει στις λειτουργίες.
συμπέρασμα
Η υπερφόρτωση και η υπερκάλυψη εμφανίζονται παρόμοια, αλλά αυτό δεν συμβαίνει. Οι λειτουργίες μπορούν να υπερφορτωθούν, αλλά οποιαδήποτε κατηγορία δεν μπορεί να επαναπροσδιορίσει περαιτέρω τη λειτουργία υπερφόρτωσης στο μέλλον. Μια εικονική λειτουργία δεν μπορεί να υπερφορτωθεί. μπορούν να αντικατασταθούν μόνο.