cpp:inheritance
                Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| cpp:inheritance [2017/05/11 08:46] – gthanos | cpp:inheritance [2022/05/13 07:01] (current) – [Κληρονομικότητα] gthanos | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Κληρονομικότητα ====== | ====== Κληρονομικότητα ====== | ||
| - | Σε αναλογία με τη Java, οι κλάσεις στη C++ μπορούν να επεκταθούν μέσω της κληρονομικότητας, | + | Οι κλάσεις στη C++ μπορούν να επεκταθούν μέσω της κληρονομικότητας, | 
| - | Στο παρακάτω παράδειγμα, | + | Στο παρακάτω παράδειγμα, | 
| - | <code cpp Shape2D.cpp> | + | <code cpp Shape.hpp> | 
| - | #include < | + | class Shape { | 
| - | #include < | + | |
| - | using namespace std; | + | |
| - | + | ||
| - | #ifndef __SHAPE2D__ | + | |
| - | #define __SHAPE2D__ | + | |
| - | + | ||
| - | class Shape2D  | + | |
| 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); | ||
| unsigned int getColor(); | unsigned int getColor(); | ||
| - |     unsigned char getBorderWidth(); | ||
| - | void setBorderWidth(unsigned char bw); | ||
| unsigned int getArea(); | unsigned int getArea(); | ||
| }; | }; | ||
| + | </ | ||
| - | void Shape2D:: | + | <code cpp Shape.cpp> | 
| - | void Shape2D:: | + | #include < | 
| + | using namespace std; | ||
| + | |||
| + | #include " | ||
| + | |||
| + | void Shape:: | ||
| + | void Shape:: | ||
| color = red; | color = red; | ||
| color <<= 8; | color <<= 8; | ||
| Line 37: | Line 35: | ||
| } | } | ||
| - | unsigned int Shape2D:: | + | unsigned int Shape:: | 
| return color; | return color; | ||
| } | } | ||
| - | 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) { | + | } | 
| + | |||
| + | Shape::Shape(unsigned char red, unsigned char blue, unsigned char green, unsigned char bw) : borderWidth(bw) { | ||
|   setColor(red, |   setColor(red, | ||
| } | } | ||
| - | unsigned int Shape2D::getArea() { | + | unsigned int Shape::getArea() { | 
| return 0; | return 0; | ||
| } | } | ||
| - | |||
| - | unsigned char Shape2D:: | ||
| - | void Shape2D:: | ||
| - | |||
| - | #endif | ||
| </ | </ | ||
| - | <code cpp Rectangle.cpp> | + | <code cpp Rectangle.hpp> | 
| - | # | + | # | 
| - | using namespace std; | + | |
| - | #include " | + | class Rectangle : public  | 
| - | + | ||
| - | class Rectangle : public  | + | |
| private: | private: | ||
|     unsigned int width, height;   |     unsigned int width, height;   | ||
| Line 72: | Line 64: | ||
|     unsigned int getHeight(); |     unsigned int getHeight(); | ||
| unsigned int getArea(); | unsigned int getArea(); | ||
| + |      | ||
| + |     unsigned char getBorderWidth(); | ||
| + | void setBorderWidth(unsigned char bw); | ||
| }; | }; | ||
| + | </ | ||
| + | |||
| + | <code cpp Rectangle.cpp> | ||
| + | #include < | ||
| + | using namespace std; | ||
| + | |||
| + | #include " | ||
| Rectangle:: | Rectangle:: | ||
| - |    | + |    | 
| void Rectangle:: | void Rectangle:: | ||
| Line 83: | Line 85: | ||
| unsigned int Rectangle:: | unsigned int Rectangle:: | ||
| - |   return  | + |    | 
| + | * from the parent class. | ||
| + | */ | ||
| + |   int area = Shape:: | ||
| + |    | ||
| } | } | ||
| + | |||
| + | unsigned char Rectangle:: | ||
| + | void Rectangle:: | ||
| </ | </ | ||
| - | <code cpp ShapeUsage.cpp> | + | <code cpp RectangleUsage.cpp> | 
| - | #include " | + | #include " | 
| + | #include < | ||
| + | using namespace std; | ||
| int main() { | int main() { | ||
|   Rectangle rectangle(0xffffff, |   Rectangle rectangle(0xffffff, | ||
| + |   rectangle.setBorderWidth(8); | ||
|    |    | ||
|   cout << " |   cout << " | ||
| - | cout << " color: 0x" << hex << rectangle.getColor() << dec; | + |   cout << " color: 0x" <<  | 
|   cout << " borderWidth: |   cout << " borderWidth: | ||
| cout << " area: " << rectangle.getArea() << endl; | cout << " area: " << rectangle.getArea() << endl; | ||
| Line 103: | Line 115: | ||
| Από τα παραπάνω παρατηρούμε τα εξής: | Από τα παραπάνω παρατηρούμε τα εξής: | ||
| - |   - Η κληρονομικότητα δηλώνεται μέσω της δήλωσης '' | + |   - Η κληρονομικότητα δηλώνεται μέσω της δήλωσης '' | 
|   - Η απόγονος κλάση μπορεί να ορίσει επιπλέον πεδία και επιπλέον μεθόδους. Η απόγονος κλάση // |   - Η απόγονος κλάση μπορεί να ορίσει επιπλέον πεδία και επιπλέον μεθόδους. Η απόγονος κλάση // | ||
|   - Η απόγονος κλάση μπορεί να επαναορίσει μία μέθοδο η οποία είναι ήδη ορισμένη στη γονική κλάση. Η απόγονος κλάση // |   - Η απόγονος κλάση μπορεί να επαναορίσει μία μέθοδο η οποία είναι ήδη ορισμένη στη γονική κλάση. Η απόγονος κλάση // | ||
| - |   - Τα μέλη της γονικής κλάσης //Shape2D// που είναι δηλωμένα ως // | + |   - Τα μέλη της γονικής κλάσης //Shape// που είναι δηλωμένα ως // | 
| - |   - Τα μέλη της γονικής κλάσης //Shape2D// που είναι δηλωμένα ως //private// δεν είναι προσβάσιμα από την απόγονο κλάση // | + |   - Τα μέλη της γονικής κλάσης //Shape// που είναι δηλωμένα ως //private// δεν είναι προσβάσιμα από την απόγονο κλάση // | 
| - |   - Όπως και στη Java, τα μέλη της γονικής κλάσης //Shape2D// ή της απογόνου κλάσης // | + |   - Όπως και στη Java, τα μέλη της γονικής κλάσης //Shape// ή της απογόνου κλάσης // | 
| Συνοπτικά ο πίνακας προσβασιμότητας παρατίθεται παρακάτω: | Συνοπτικά ο πίνακας προσβασιμότητας παρατίθεται παρακάτω: | ||
| ^                  ^  μέλη της γονικής κλάσης  | ^                  ^  μέλη της γονικής κλάσης  | ||
| ^  προσβασιμότητα  | ^  προσβασιμότητα  | ||
| - | | μέλη  | + | | από  | 
| - | | μέλη  | + | | από  | 
| - | | μη μέλη της  | + | | από  | 
| + | ===== Κλήση μιας επανα-ορισμένης μεθόδου της γονικής κλάσης από την υποκλάση ===== | ||
| - | <WRAP center round info 80%> | + | Όταν η απόγονος κλάση επαναορίζει μία μέθοδο με το ίδιο  | 
| - | Όταν η απόγονος κλάση επαναορίζει μία μέθοδο με το ίδιο signature (ίδιο όνομα, ίδιος αριθμός και τύπος ορισμάτων) τότε συχνά θέλουμε να χρησιμοποιήσουμε τη γονική  | + | |
| <code cpp> | <code cpp> | ||
| unsigned int Rectangle:: | unsigned int Rectangle:: | ||
| - |   return  | + |   return  | 
| } | } | ||
| </ | </ | ||
| - | </ | ||
cpp/inheritance.1494492403.txt.gz · Last modified: 2017/05/11 07:46 (external edit)
                
                