Βίντεο: Mitch Resnick: Let's teach kids to code 2024
Στην C ++, μόνο και μόνο επειδή νομίζετε ότι μια συγκεκριμένη κλήση λειτουργίας είναι συνδεδεμένη αργά δεν σημαίνει ότι είναι. Αν δεν δηλωθούν με τα ίδια επιχειρήματα στις υποκατηγορίες, οι λειτουργίες των μελών δεν υπερβαίνουν πολυμορφικά, ανεξάρτητα από το αν δηλώνονται ή όχι εικονικές.
Μία εξαίρεση από τον ίδιο κανόνα δήλωσης είναι ότι εάν η συνάρτηση μέλους στη βασική κλάση επιστρέφει έναν δείκτη ή μια αναφορά σε ένα αντικείμενο κλάσης βάσης, μια συνάρτηση του αντικατασταθέντος μέλους σε μια υποκατηγορία μπορεί να επιστρέψει έναν δείκτη ή μια αναφορά σε ένα αντικείμενο της υποκατηγορίας. Με άλλα λόγια, η λειτουργία makeACopy () είναι πολυμορφική, παρόλο που ο τύπος επιστροφής των δύο λειτουργιών διαφέρει:
class Βάση {public: // επιστροφή ενός αντιγράφου του τρέχοντος αντικειμένου Base * makeACopy ();}; class Υποκατηγορία: δημόσια Βάση {public: // επιστροφή ενός αντιγράφου του τρέχοντος αντικειμένου SubClass * makeACopy ();}; κενό fn (Βάση & bc) {Base * pCopy = bc. Κάνε ένα αντίγραφο(); // συνεχίστε …}
Στην πράξη, αυτό είναι φυσικό. Μια συνάρτηση makeACopy () θα πρέπει να επιστρέψει ένα αντικείμενο τύπου SubClass , ακόμα και αν μπορεί να αντικαταστήσει το BaseClass:: makeACopy () .
Αυτή η δραστηριότητα σιωπηλά αποφασίζει πότε μια λειτουργία είναι overridden και όταν δεν είναι μια πηγή σφάλματος στην C ++. τόσο πολύ ώστε το πρότυπο του 2011 εισήγαγε τον περιγραφέα να παρακάμψει που ο προγραμματιστής μπορεί να χρησιμοποιήσει για να υποδείξει την πρόθεσή του να αντικαταστήσει μια λειτουργία βασικής κλάσης.
τάξη Φοιτητής {δημόσια: εικονικό κενό addCourseGrade (διπλός βαθμός);}; class GradStudent: public Φοιτητής {δημόσια: εικονικό κενό addCourseGrade (float grade) override;};
Αυτό το απόσπασμα δημιουργεί ένα σφάλμα χρόνου μεταγλώττισης επειδή η μέθοδος GradStudent:: addCourseGrade (float) δηλώθηκε ότι παρακάμπτεται, αλλά στην πραγματικότητα δεν παρακάμπτει τη συνάρτηση class class Student:: addCourseGrade (διπλό) t ταιριάζει.τελική
, ακόμα και αν αυτή η ίδια η λειτουργία υπερισχύει με κάποια προηγούμενη συνάρτηση βασικής κλάσης, όπως φαίνεται από τα ακόλουθα πρόσθετα > PostDocτάξη: τάξη GradStudent: δημόσιο Φοιτητής {δημόσια: εικονικό κενό addCourseGrade (διπλός βαθμός) τελικός?}; class PostDoc: δημόσιο GradStudent {public: virtual void addCourseGrade (διπλός βαθμός),}, Από το Student:: addCourseGrade () σημειώνεται τελικό , η δήλωση του PostDoc:: addCourseGrade () δημιουργεί ένα σφάλμα επειδή επιχειρεί να παρακάμψει τη μέθοδο
Student. τελική
δεν μπορεί να κληρονομηθεί καθόλου.