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