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 09:43]
gthanos
cpp:polymorphism [2020/04/15 08:48]
Line 1: Line 1:
-====== Δυναμικός Πολυμορφισμός ====== 
- 
-Ας επανέλθουμε στο αρχικό παράδειγμα της κληρονομικότητας και ας ορίσουμε δύο νέες μεταβλητές α) μία μεταβλητή τύπου δείκτη και μία μεταβλητή τύπου αναφορά σε ένα αντικείμενο τύπου //Shape2D// ως εξής: 
- 
-<code cpp 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; 
-} 
-</code> 
- 
-Μεταγλωττίζοντας και εκτελώντας τον παραπάνω κώδικα λαμβάνουμε τα εξής: 
-<code> 
-Rectangle area: 200 
-Reference area: 0 
-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> 
-Rectangle area: 200 
-Reference area: 200 
-Pointer area: 200 
-</code> 
- 
  
cpp/polymorphism.txt · Last modified: 2020/04/15 08:48 (external edit)