User Tools

Site Tools


cpp:polymorphism

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
cpp:polymorphism [2017/04/25 12:21]
gthanos
cpp:polymorphism [2020/04/15 08:48]
Line 1: Line 1:
-====== Δυναμικός Πολυμορφισμός ====== 
- 
-Ας επανέλθουμε στο αρχικό παράδειγμα της κληρονομικότητας και ας ορίσουμε δύο νέες μεταβλητές α) μία μεταβλητή τύπου δείκτη και μία μεταβλητή τύπου αναφορά σε ένα αντικείμενο τύπου //Shape2D// ως εξής: 
- 
-<code cpp 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; 
- 
-</code> 
- 
-Μεταγλωττίζοντας και εκτελώντας τον παραπάνω κώδικα λαμβάνουμε τα εξής: 
-<code> 
-Shape2D area: 0 
-Shape2D reference area: 0 
-Shape2D pointer area: 0 
- 
-Rectangle area: 200 
-Rectangle reference area: 0 
-Rectangle pointer area: 0 
-</code> 
- 
-Από τα παραπάνω συμπεραίνουμε ότι η επιλογή κλήσης της μεθόδου //getArea// δεν γίνεται δυναμικά με βάση τον τύπο του αντικειμένου στον οποίο δείχνει ο δείκτης ή η αναφορά, αλλά στατικά με βάση τον τύπο δεδομένων για τον οποίο δηλώνεται ο δείκτης ή η αναφορά. Σε αυτή την περίπτωση η επιλογή της μεθόδου γίνεται από τον //compiler// κατά τη μεταγλώττιση του προγράμματος. 
- 
-Εάν θέλουμε η επιλογή της μεθόδου να γίνεται δυναμικά με βάση τον τύπο του αντικειμένου που δείχνει ο δείκτης ή η αναφορά θα πρέπει να δηλώσουμε τη μέθοδο //getArea// στη γονική κλάση //Shape2D// ως //**virtual**// όπως παρακάτω: 
-<code cpp> 
-class Shape2D { 
-  public: 
-    virtual unsigned int getArea(); 
-} 
-unsigned int Shape2D::getArea() { return 0; } 
-</code> 
- 
-Με αυτό τον τρόπο δηλώνουμε προς τον //compiler// ότι η απόφαση για τον ποια μέθοδος θα κληθεί δεν θα ληφθεί κατά τη μεταγλώττιση, αλλά κατά την εκτέλεση του προγράμματος. Δηλώνοντας τη μέθοδο //getArea// ως //**virtual**// στη γονική κλάση το αποτέλεσμα της εκτέλεσης είναι το εξής: 
-<code> 
-Shape2D area: 0 
-Shape2D reference area: 0 
-Shape2D pointer area: 0 
- 
-Rectangle area: 200 
-Rectangle reference area: 200 
-Rectangle pointer area: 200 
-</code> 
- 
  
cpp/polymorphism.txt · Last modified: 2020/04/15 08:48 (external edit)