cpp:polymorphism
Differences
This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
cpp:polymorphism [2017/04/25 09:28] – created gthanos | cpp:polymorphism [Unknown date] (current) – external edit (Unknown date) 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== Δυναμικός Πολυμορφισμός ====== | ====== Δυναμικός Πολυμορφισμός ====== | ||
- | Ας επανέλθουμε στο αρχικό παράδειγμα της κληρονομικότητας. | + | Ας επανέλθουμε στο αρχικό παράδειγμα της κληρονομικότητας |
+ | |||
+ | <code cpp ShapeUsage.cpp> | ||
+ | #include " | ||
+ | |||
+ | int main() { | ||
+ | Shape shape(0x333333, | ||
+ | Shape & | ||
+ | Rectangle rectangle(0xffffff, | ||
+ | Shape & | ||
+ | |||
+ | cout << "Shape area: " << shape.getArea() << endl; | ||
+ | cout << "Shape reference area: " << shape_ref.getArea() << endl; | ||
+ | cout << "Shape pointer area: " << shape_ptr-> | ||
+ | cout << endl; | ||
+ | cout << " | ||
+ | cout << " | ||
+ | cout << " | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Μεταγλωττίζοντας και εκτελώντας τον παραπάνω κώδικα λαμβάνουμε τα εξής: | ||
+ | < | ||
+ | Shape area: 0 | ||
+ | Shape reference area: 0 | ||
+ | Shape pointer area: 0 | ||
+ | |||
+ | Rectangle area: 200 | ||
+ | Rectangle reference area: 0 | ||
+ | Rectangle pointer area: 0 | ||
+ | </ | ||
+ | |||
+ | Από τα παραπάνω συμπεραίνουμε ότι η επιλογή κλήσης της μεθόδου //getArea// δεν γίνεται δυναμικά με βάση τον τύπο του αντικειμένου στον οποίο δείχνει ο δείκτης ή η αναφορά, | ||
+ | |||
+ | Εάν θέλουμε η επιλογή της μεθόδου να γίνεται δυναμικά με βάση τον τύπο του αντικειμένου που δείχνει ο δείκτης ή η αναφορά θα πρέπει να δηλώσουμε τη μέθοδο //getArea// στη γονική κλάση //Shape// ως // | ||
+ | <code cpp> | ||
+ | class Shape { | ||
+ | public: | ||
+ | virtual unsigned int getArea(); | ||
+ | }; | ||
+ | unsigned int Shape:: | ||
+ | </ | ||
+ | |||
+ | Με αυτό τον τρόπο δηλώνουμε προς τον // | ||
+ | < | ||
+ | Shape area: 0 | ||
+ | Shape reference area: 0 | ||
+ | Shape 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 Shape { | ||
+ | unsigned int color; | ||
+ | protected: | ||
+ | unsigned char borderWidth; | ||
+ | public: | ||
+ | Shape(unsigned int c, unsigned char bw); | ||
+ | Shape(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 Shape:: | ||
+ | void Shape:: | ||
+ | color = red; | ||
+ | color <<= 8; | ||
+ | color |= blue; | ||
+ | color <<= 8; | ||
+ | color |= green; | ||
+ | } | ||
+ | |||
+ | unsigned int Shape:: | ||
+ | Shape:: | ||
+ | Shape:: | ||
+ | unsigned char Shape:: | ||
+ | void Shape:: | ||
+ | #endif | ||
+ | </ | ||
+ | |||
+ | Αντίστοιχα, | ||
+ | <code cpp> | ||
+ | unsigned int Rectangle:: | ||
+ | return width * height; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Επειδή η κλάση //Shape// είναι πλέον // | ||
+ | <code cpp ShapeUsage.cpp> | ||
+ | #include " | ||
+ | |||
+ | int main() { | ||
+ | Rectangle rectangle(0xffffff, | ||
+ | Shape & | ||
+ | |||
+ | cout << " | ||
+ | cout << " | ||
+ | cout << " | ||
+ | } | ||
+ | </ | ||
cpp/polymorphism.1493112533.txt.gz · Last modified: 2017/04/25 08:28 (external edit)