This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision | |||
|
cpp:polymorphism [2017/05/11 09:13] gthanos [Δυναμικός Πολυμορφισμός] |
cpp:polymorphism [2020/04/15 08:48] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Δυναμικός Πολυμορφισμός ====== | ||
| - | |||
| - | Ας επανέλθουμε στο αρχικό παράδειγμα της κληρονομικότητας και ας ορίσουμε δύο νέες μεταβλητές α) μία μεταβλητή τύπου δείκτη και μία μεταβλητή τύπου αναφορά σε ένα αντικείμενο τύπου //Shape2D// ως εξής: | ||
| - | |||
| - | <code cpp ShapeUsage.cpp> | ||
| - | #include " | ||
| - | |||
| - | int main() { | ||
| - | Shape2D shape(0x333333, | ||
| - | Shape2D & | ||
| - | Rectangle rectangle(0xffffff, | ||
| - | Shape2D & | ||
| - | |||
| - | cout << " | ||
| - | cout << " | ||
| - | cout << " | ||
| - | cout << endl; | ||
| - | cout << " | ||
| - | cout << " | ||
| - | cout << " | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | Μεταγλωττίζοντας και εκτελώντας τον παραπάνω κώδικα λαμβάνουμε τα εξής: | ||
| - | < | ||
| - | Shape2D area: 0 | ||
| - | Shape2D reference area: 0 | ||
| - | Shape2D pointer area: 0 | ||
| - | |||
| - | Rectangle area: 200 | ||
| - | Rectangle reference area: 0 | ||
| - | Rectangle pointer area: 0 | ||
| - | </ | ||
| - | |||
| - | Από τα παραπάνω συμπεραίνουμε ότι η επιλογή κλήσης της μεθόδου //getArea// δεν γίνεται δυναμικά με βάση τον τύπο του αντικειμένου στον οποίο δείχνει ο δείκτης ή η αναφορά, | ||
| - | |||
| - | Εάν θέλουμε η επιλογή της μεθόδου να γίνεται δυναμικά με βάση τον τύπο του αντικειμένου που δείχνει ο δείκτης ή η αναφορά θα πρέπει να δηλώσουμε τη μέθοδο //getArea// στη γονική κλάση //Shape2D// ως // | ||
| - | <code cpp> | ||
| - | class Shape2D { | ||
| - | public: | ||
| - | virtual unsigned int getArea(); | ||
| - | }; | ||
| - | unsigned int Shape2D:: | ||
| - | </ | ||
| - | |||
| - | Με αυτό τον τρόπο δηλώνουμε προς τον // | ||
| - | < | ||
| - | Shape2D area: 0 | ||
| - | Shape2D reference area: 0 | ||
| - | Shape2D pointer area: 0 | ||
| - | |||
| - | Rectangle area: 200 | ||
| - | Rectangle reference area: 200 | ||
| - | Rectangle pointer area: 200 | ||
| - | </ | ||
| - | |||
| - | ====== Pure virtual συναρτήσεις και abstract κλάσεις ====== | ||
| - | |||
| - | Εκτός από τις //virtual// μεθόδους που είδαμε προηγούμενα μπορούμε να έχουμε και //pure virtual// μεθόδους. Οι μέθοδοι που χαρακτηρίζονται //pure virtual// όταν ορίζονται σε μία κλάση, δηλώνεται μόνο το // | ||
| - | <code cpp> | ||
| - | virtual <return type> < | ||
| - | </ | ||
| - | |||
| - | Η κλάση που περιέχει μία ή περισσότερες //pure virtual// συναρτήσεις είναι // | ||
| - | |||
| - | Για παράδειγμα, | ||
| - | |||
| - | <code cpp Shape.cpp> | ||
| - | #include < | ||
| - | #include < | ||
| - | using namespace std; | ||
| - | |||
| - | #ifndef __SHAPE2D__ | ||
| - | #define __SHAPE2D__ | ||
| - | |||
| - | class Shape2D { | ||
| - | unsigned int color; | ||
| - | protected: | ||
| - | unsigned char borderWidth; | ||
| - | public: | ||
| - | Shape2D(unsigned int c, unsigned char bw); | ||
| - | Shape2D(unsigned char red, unsigned char blue, unsigned char green, unsigned char bw); | ||
| - | void setColor(unsigned int c); | ||
| - | void setColor(unsigned char red, unsigned char blue, unsigned char green); | ||
| - | unsigned int getColor(); | ||
| - | unsigned char getBorderWidth(); | ||
| - | void setBorderWidth(unsigned char bw); | ||
| - | virtual unsigned int getArea() = 0; | ||
| - | }; | ||
| - | |||
| - | void Shape2D:: | ||
| - | void Shape2D:: | ||
| - | color = red; | ||
| - | color <<= 8; | ||
| - | color |= blue; | ||
| - | color <<= 8; | ||
| - | color |= green; | ||
| - | } | ||
| - | |||
| - | unsigned int Shape2D:: | ||
| - | Shape2D:: | ||
| - | Shape2D:: | ||
| - | unsigned char Shape2D:: | ||
| - | void Shape2D:: | ||
| - | #endif | ||
| - | </ | ||
| - | |||
| - | Αντίστοιχα, | ||
| - | <code cpp> | ||
| - | unsigned int Rectangle:: | ||
| - | return width * height; | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | Επειδή η κλάση //Shape2D// είναι πλέον // | ||
| - | <code cpp ShapeUsage.cpp> | ||
| - | #include " | ||
| - | |||
| - | int main() { | ||
| - | Rectangle rectangle(0xffffff, | ||
| - | Shape2D & | ||
| - | |||
| - | cout << " | ||
| - | cout << " | ||
| - | cout << " | ||
| - | } | ||
| - | </ | ||
| - | |||