cpp:polymorphism
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| cpp:polymorphism [2017/04/25 12:54] – [Pure Virtual συναρτήσεις και abstract κλάσεις] gthanos | cpp:polymorphism [Unknown date] (current) – external edit (Unknown date) 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Δυναμικός Πολυμορφισμός ====== | ====== Δυναμικός Πολυμορφισμός ====== | ||
| - | Ας επανέλθουμε στο αρχικό παράδειγμα της κληρονομικότητας και ας ορίσουμε δύο νέες μεταβλητές α) μία μεταβλητή τύπου δείκτη και μία μεταβλητή τύπου αναφορά σε ένα αντικείμενο τύπου //Shape2D// ως εξής: | + | Ας επανέλθουμε στο αρχικό παράδειγμα της κληρονομικότητας και ας ορίσουμε δύο νέες μεταβλητές α) μία μεταβλητή τύπου δείκτη και μία μεταβλητή τύπου αναφορά σε ένα αντικείμενο τύπου //Shape// ως εξής: |
| <code cpp ShapeUsage.cpp> | <code cpp ShapeUsage.cpp> | ||
| #include " | #include " | ||
| - | #include " | ||
| int main() { | int main() { | ||
| - | | + | |
| - | | + | |
| Rectangle rectangle(0xffffff, | Rectangle rectangle(0xffffff, | ||
| - | | + | |
| - | cout << "Shape2D | + | cout << "Shape area: " << shape.getArea() << endl; |
| - | cout << "Shape2D | + | cout << "Shape reference area: " << shape_ref.getArea() << endl; |
| - | cout << "Shape2D | + | cout << "Shape pointer area: " << shape_ptr-> |
| cout << endl; | cout << endl; | ||
| cout << " | cout << " | ||
| Line 25: | Line 24: | ||
| Μεταγλωττίζοντας και εκτελώντας τον παραπάνω κώδικα λαμβάνουμε τα εξής: | Μεταγλωττίζοντας και εκτελώντας τον παραπάνω κώδικα λαμβάνουμε τα εξής: | ||
| < | < | ||
| - | Shape2D | + | Shape area: 0 |
| - | Shape2D | + | Shape reference area: 0 |
| - | Shape2D | + | Shape pointer area: 0 |
| Rectangle area: 200 | Rectangle area: 200 | ||
| Line 36: | Line 35: | ||
| Από τα παραπάνω συμπεραίνουμε ότι η επιλογή κλήσης της μεθόδου //getArea// δεν γίνεται δυναμικά με βάση τον τύπο του αντικειμένου στον οποίο δείχνει ο δείκτης ή η αναφορά, | Από τα παραπάνω συμπεραίνουμε ότι η επιλογή κλήσης της μεθόδου //getArea// δεν γίνεται δυναμικά με βάση τον τύπο του αντικειμένου στον οποίο δείχνει ο δείκτης ή η αναφορά, | ||
| - | Εάν θέλουμε η επιλογή της μεθόδου να γίνεται δυναμικά με βάση τον τύπο του αντικειμένου που δείχνει ο δείκτης ή η αναφορά θα πρέπει να δηλώσουμε τη μέθοδο //getArea// στη γονική κλάση //Shape2D// ως // | + | Εάν θέλουμε η επιλογή της μεθόδου να γίνεται δυναμικά με βάση τον τύπο του αντικειμένου που δείχνει ο δείκτης ή η αναφορά θα πρέπει να δηλώσουμε τη μέθοδο //getArea// στη γονική κλάση //Shape// ως // |
| <code cpp> | <code cpp> | ||
| - | class Shape2D | + | class Shape { |
| public: | public: | ||
| virtual unsigned int getArea(); | virtual unsigned int getArea(); | ||
| - | } | + | }; |
| - | unsigned int Shape2D::getArea() { return 0; } | + | unsigned int Shape::getArea() { return 0; } |
| </ | </ | ||
| Με αυτό τον τρόπο δηλώνουμε προς τον // | Με αυτό τον τρόπο δηλώνουμε προς τον // | ||
| < | < | ||
| - | Shape2D | + | Shape area: 0 |
| - | Shape2D | + | Shape reference area: 0 |
| - | Shape2D | + | Shape pointer area: 0 |
| Rectangle area: 200 | Rectangle area: 200 | ||
| Line 56: | Line 55: | ||
| </ | </ | ||
| - | ====== Pure Virtual | + | ====== Pure virtual |
| Εκτός από τις //virtual// μεθόδους που είδαμε προηγούμενα μπορούμε να έχουμε και //pure virtual// μεθόδους. Οι μέθοδοι που χαρακτηρίζονται //pure virtual// όταν ορίζονται σε μία κλάση, δηλώνεται μόνο το // | Εκτός από τις //virtual// μεθόδους που είδαμε προηγούμενα μπορούμε να έχουμε και //pure virtual// μεθόδους. Οι μέθοδοι που χαρακτηρίζονται //pure virtual// όταν ορίζονται σε μία κλάση, δηλώνεται μόνο το // | ||
| Line 65: | Line 64: | ||
| Η κλάση που περιέχει μία ή περισσότερες //pure virtual// συναρτήσεις είναι // | Η κλάση που περιέχει μία ή περισσότερες //pure virtual// συναρτήσεις είναι // | ||
| - | Για παράδειγμα, | + | Για παράδειγμα, |
| <code cpp Shape.cpp> | <code cpp Shape.cpp> | ||
| Line 75: | Line 74: | ||
| #define __SHAPE2D__ | #define __SHAPE2D__ | ||
| - | class Shape2D | + | class Shape { |
| unsigned int color; | unsigned int color; | ||
| protected: | protected: | ||
| unsigned char borderWidth; | unsigned char borderWidth; | ||
| public: | public: | ||
| - | | + | |
| - | | + | |
| void setColor(unsigned int c); | void setColor(unsigned int c); | ||
| void setColor(unsigned char red, unsigned char blue, unsigned char green); | void setColor(unsigned char red, unsigned char blue, unsigned char green); | ||
| Line 90: | Line 89: | ||
| }; | }; | ||
| - | void Shape2D:: | + | void Shape:: |
| - | void Shape2D:: | + | void Shape:: |
| color = red; | color = red; | ||
| color <<= 8; | color <<= 8; | ||
| Line 99: | Line 98: | ||
| } | } | ||
| - | unsigned int Shape2D:: | + | unsigned int Shape:: |
| - | Shape2D::Shape2D(unsigned int c, unsigned char bw) : color(c), borderWidth(bw) {} | + | Shape::Shape(unsigned int c, unsigned char bw) : color(c), borderWidth(bw) {} |
| - | Shape2D::Shape2D(unsigned char red, unsigned char blue, unsigned char green, unsigned char bw) : borderWidth(bw) { setColor(red, | + | Shape::Shape(unsigned char red, unsigned char blue, unsigned char green, unsigned char bw) : borderWidth(bw) { setColor(red, |
| - | unsigned char Shape2D:: | + | unsigned char Shape:: |
| - | void Shape2D:: | + | void Shape:: |
| #endif | #endif | ||
| </ | </ | ||
| Line 114: | Line 113: | ||
| </ | </ | ||
| - | Επειδή η κλάση //Shape2D// είναι πλέον // | + | Επειδή η κλάση //Shape// είναι πλέον // |
| <code cpp ShapeUsage.cpp> | <code cpp ShapeUsage.cpp> | ||
| #include " | #include " | ||
| - | #include " | ||
| int main() { | int main() { | ||
| Rectangle rectangle(0xffffff, | Rectangle rectangle(0xffffff, | ||
| - | | + | |
| cout << " | cout << " | ||
cpp/polymorphism.1493124877.txt.gz · Last modified: 2017/04/25 11:54 (external edit)
