This is an old revision of the document!
Δυναμικός Πολυμορφισμός
Ας επανέλθουμε στο αρχικό παράδειγμα της κληρονομικότητας και ας ορίσουμε δύο νέες μεταβλητές α) μία μεταβλητή τύπου δείκτη και μία μεταβλητή τύπου αναφορά σε ένα αντικείμενο τύπου Shape2D ως εξής:
- ShapeUsage.cpp
#include "Rectangle.cpp" int main() { Rectangle rectangle(0xffffff, 2, 10, 20); Shape2D &ref = rectangle, *ptr = &rectangle; cout << "Rectangle area: " << rectangle.getArea() << endl; cout << "Reference area: " << ref.getArea() << endl; cout << "Pointer area: " << ptr->getArea() << endl; return 0; }
Μεταγλωττίζοντας και εκτελώντας τον παραπάνω κώδικα λαμβάνουμε τα εξής:
Rectangle area: 200 Reference area: 0 Pointer area: 0
Από τα παραπάνω συμπεραίνουμε ότι η επιλογή κλήσης της μεθόδου getArea δεν γίνεται δυναμικά με βάση τον τύπο του αντικειμένου στον οποίο δείχνει ο δείκτης ή η αναφορά, αλλά στατικά με βάση τον τύπο δεδομένων για τον οποίο δηλώνεται ο δείκτης ή η αναφορά. Σε αυτή την περίπτωση η επιλογή της μεθόδου γίνεται από τον compiler κατά τη μεταγλώττιση του προγράμματος.
Εάν θέλουμε η επιλογή της μεθόδου να γίνεται δυναμικά με βάση τον τύπο του αντικειμένου που δείχνει ο δείκτης ή η αναφορά θα πρέπει να δηλώσουμε τη μέθοδο getArea στη γονική κλάση Shape2D ως virtual όπως παρακάτω:
<class Shape2D { public: virtual unsigned int getArea(); } unsigned int Shape2D::getArea() { return 0; }
Με αυτό τον τρόπο δηλώνουμε προς τον compiler ότι η απόφαση για τον ποιά μέθοδος θα κληθεί δεν θα ληφθεί κατά τη μεταγλώττιση, αλλά κατά την εκτέλεση του προγράμματος. Δηλώνοντας τη μέθοδο getArea ως virtual στη γονική κλάση το αποτέλεσμα της εκτέλεσης είναι το εξής:
Rectangle area: 200 Reference area: 200 Pointer area: 200