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/04/22 09:54] – [Άλλες μορφές κληρονομικότητας] gthanos | cpp:inheritance [2022/05/13 07:01] (current) – [Κληρονομικότητα] gthanos | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== Κληρονομικότητα ====== | ====== Κληρονομικότητα ====== | ||
- | ====== Κληρονομικότητα | + | Οι κλάσεις στη C++ μπορούν να επεκταθούν μέσω της κληρονομικότητας, δημιουργώντας νέες κλάσεις που διατηρούν τα χαρακτηριστικά των προγόνων τους. Η κληρονομικότητα προϋποθέτει ότι υπάρχει η βασική κλάση (πρόγονος) από την οποία προκύπτουν μία ή περισσότερες κλάσεις (απόγονοι). Οι απόγονοι διατηρούν τα χαρακτηριστικά του προγόνου, |
- | Σε αναλογία με τη Java, οι κλάσεις στη C++ μπορούν να επεκταθούν μέσω | + | Στο παρακάτω παράδειγμα, από |
- | Στο παρακάτω παράδειγμα, | + | <code cpp Shape.hpp> |
- | + | class Shape { | |
- | <code cpp Rectangle.cpp> | + | |
- | #include < | + | |
- | using namespace std; | + | |
- | + | ||
- | class Rectangle | + | |
- | private: | + | |
- | int width; | + | |
protected: | protected: | ||
- | | + | |
public: | public: | ||
- | | + | |
- | | + | |
- | void setWidth(int w); | + | void setColor(unsigned |
- | void setHeight(int h); | + | void setColor(unsigned char red, unsigned char blue, unsigned char green); |
- | int getWidth(); | + | |
- | int getHeight(); | + | |
}; | }; | ||
- | |||
- | Rectangle:: | ||
- | width = w; height = h; | ||
- | } | ||
- | |||
- | bool Rectangle:: | ||
- | if(r.width == width && r.height == height) | ||
- | return true; | ||
- | return false; | ||
- | } | ||
- | |||
- | void Rectangle:: | ||
- | void Rectangle:: | ||
- | int Rectangle:: | ||
- | int Rectangle:: | ||
</ | </ | ||
- | <code cpp Square.cpp> | + | <code cpp Shape.cpp> |
- | # | + | # |
+ | using namespace std; | ||
- | class Square: public Rectangle { | + | #include " |
- | int color; | + | |
- | | + | |
- | | + | |
- | bool equals(Square &s); | + | |
- | void setColor(int c); | + | |
- | void setColor(unsigned char r, unsigned char b, unsigned char g); | + | |
- | int getColor(); | + | |
- | int getArea(); | + | |
- | }; | + | |
- | Square:: | + | void Shape::setColor(unsigned |
- | void Square:: | + | void Shape:: |
- | void Square:: | + | |
color = red; | color = red; | ||
color <<= 8; | color <<= 8; | ||
Line 65: | Line 35: | ||
} | } | ||
- | int Square:: | + | unsigned |
return color; | return color; | ||
} | } | ||
- | int Square::getArea() { | + | Shape::Shape(unsigned int c, unsigned char bw) : color(c), borderWidth(bw) { |
- | // height is accessible from Square | + | |
- | // since it is a protected member. | + | |
- | return getWidth() * height; | + | |
} | } | ||
- | bool Square::equals(Square &s) { | + | Shape::Shape(unsigned char red, unsigned char blue, unsigned char green, unsigned char bw) : borderWidth(bw) { |
- | if( Rectangle:: | + | |
- | | + | |
- | | + | |
} | } | ||
- | </ | ||
- | <code cpp SquareUsage.cpp> | + | unsigned |
- | #include " | + | |
- | + | ||
- | int main() { | + | |
- | Square square(5); | + | |
- | cout << " | + | |
- | cout << " | + | |
return 0; | return 0; | ||
} | } | ||
</ | </ | ||
- | Από τα παραπάνω παρατηρούμε τα εξής: | + | <code cpp Rectangle.hpp> |
- | - Η κληρονομικότητα δηλώνεται μέσω της δήλωσης '' | + | #include "Shape.hpp" |
- | - Τα μέλη της γονικής κλάσης // | + | |
- | - Όπως και στη Java, τα μέλη της γονικής κλάσης // | + | |
- | Συνοπτικά ο πίνακας προσβασιμότητας παρατίθεται παρακάτω: | + | class Rectangle |
- | ^ ^ μέλη της γονικής κλάσης | + | private: |
- | ^ προσβασιμότητα | + | |
- | | μέλη της ίδιας κλάσης | + | |
- | | μέλη υποκλάσης | + | |
- | | μη μέλη της κλάσης | + | void setWidth(unsigned int w); |
- | + | void setHeight(unsigned int h); | |
- | <WRAP center round info 80%> | + | |
- | Όταν μία κλάση έχει πρόσβαση σε ένα πεδίο, το πεδίο αυτό δεν είναι προσβάσιμο μόνο για το τρέχον αντικείμενο, αλλά και για όλα αντικείμενα του τύπου της κλάσης. Στο παραπάνω παράδειγμα, η μέθοδος //equals// στις κλάσεις // | + | unsigned int getHeight(); |
- | </ | + | |
- | + | | |
- | <WRAP center round info 80%> | + | unsigned char getBorderWidth(); |
- | Όταν η απόγονος κλάση επαναορίζει μία μέθοδο με το ίδιο signature | + | |
- | <code cpp> | + | }; |
- | bool Square:: | + | |
- | | + | |
- | return true; | + | |
- | | + | |
- | } | + | |
</ | </ | ||
- | </ | ||
- | ===== Άλλες μορφές κληρονομικότητας ===== | + | <code cpp Rectangle.cpp> |
+ | #include < | ||
+ | using namespace std; | ||
- | Εκτός από την κληρονομικότητα τύπου //public// ('' | + | #include "Rectangle.hpp" |
- | ^ | + | |
- | ^ μέλη της γονικής κλάσης | + | |
- | | public μέλη | + | |
- | | protected μέλη | + | |
- | | private μέλη | + | |
- | Δείτε το παρακάτω παράδειγμα που παραθέτει αναλυτικά τα επίπεδα της προσβασιμότητας | + | Rectangle:: |
+ | Shape(c, bw) , width(w), height(h) { } | ||
- | <code cpp> | + | void Rectangle:: |
- | class Parent { | + | void Rectangle:: |
- | public: | + | unsigned int Rectangle::getWidth() { return width; } |
- | | + | unsigned |
- | protected: | + | |
- | | + | |
- | private: | + | |
- | int privateMember; | + | |
- | }; | + | |
- | class ChildA | + | unsigned int Rectangle::getArea() |
- | // publicMember | + | /* this is how you call a function |
- | // protectedMember is protected | + | * from the parent class. |
- | // privateMember is not accessible from ChildA | + | */ |
- | }; | + | int area = Shape:: |
+ | return Shape:: | ||
+ | } | ||
- | class ChildB | + | unsigned char Rectangle:: |
- | // publicMember is protected | + | void Rectangle::setBorderWidth(unsigned char bw) { borderWidth = bw; } |
- | // protectedMember is protected | + | |
- | // privateMember is not accessible from ChildB | + | |
- | }; | + | |
- | + | ||
- | class ChildC | + | |
- | // publicMember is private | + | |
- | // protectedMember is private | + | |
- | // privateMember is not accessible from ChildC | + | |
- | }; | + | |
</ | </ | ||
- | Στο παραπάνω παράδειγμα συμπερασματικά θα μπορούσαμε να πούμε τα εξής: | + | <code cpp RectangleUsage.cpp> |
- | * Για την κλάση //ChildA// (//public// κληρονομικότητα) οποιαδήποτε κλάση γνωρίζει ότι η //ChildA// είναι απόγονος της //Parent//. | + | #include " |
- | * Για την κλάση //ChildB// (// | + | #include < |
- | * Για την κλάση //ChildC// (// | + | using namespace std; |
- | <WRAP center round tip 80%> | + | int main() { |
- | Η κληρονομικότητα τύπου //private// ή // | + | Rectangle rectangle(0xffffff, |
- | </WRAP> | + | rectangle.setBorderWidth(8); |
+ | |||
+ | cout << " | ||
+ | cout << " color: 0x" << std::hex << rectangle.getColor() << dec; | ||
+ | cout << " borderWidth: | ||
+ | cout << " area: " << rectangle.getArea() << endl; | ||
+ | |||
+ | return 0; | ||
+ | } | ||
+ | </code> | ||
- | ===== Πολλαπλή κληρονομικότητα | + | Από τα παραπάνω παρατηρούμε τα εξής: |
- | + | - Η κληρονομικότητα δηλώνεται μέσω | |
- | Η C++ δίνει την δυνατότητα να έχετε περισσότερες από | + | - Η απόγονος κλάση μπορεί |
- | + | - Η απόγονος κλάση μπορεί να επαναορίσει μία μέθοδο | |
- | Παρακάτω δίνεται ένα | + | - Τα μέλη της γονικής κλάσης // |
+ | - Τα μέλη της γονικής κλάσης // | ||
+ | - Όπως και στη Java, τα μέλη της γονικής κλάσης //Shape// ή της απογόνου κλάσης // | ||
+ | Συνοπτικά ο πίνακας προσβασιμότητας παρατίθεται παρακάτω: | ||
+ | ^ ^ μέλη της γονικής κλάσης | ||
+ | ^ προσβασιμότητα | ||
+ | | από μεθόδους της ίδιας κλάσης | ||
+ | | από μεθόδους μίας υποκλάσης | ||
+ | | από μία άλλη κλάση χωρίς σχέση κληρονομικότητας | ||
+ | ===== Κλήση μιας επανα-ορισμένης μεθόδου της γονικής κλάσης από την υποκλάση ===== | ||
+ | Όταν η απόγονος κλάση επαναορίζει μία μέθοδο με το ίδιο // | ||
+ | <code cpp> | ||
+ | unsigned int Rectangle:: | ||
+ | return Shape:: | ||
+ | } | ||
+ | </ | ||
cpp/inheritance.1492854864.txt.gz · Last modified: 2017/04/22 08:54 (external edit)