| Both sides previous revision
Previous revision
Next revision
|
Previous revision
Next revision
Both sides next revision
|
cpp:polymorphism [2017/04/25 12:40] gthanos |
cpp:polymorphism [2017/04/25 12:54] gthanos [Pure Virtual συναρτήσεις και abstract κλάσεις] |
| virtual <return type> <function_name>(<function parameters) =0; | virtual <return type> <function_name>(<function parameters) =0; |
| </code> | </code> |
| | |
| | Η κλάση που περιέχει μία ή περισσότερες //pure virtual// συναρτήσεις είναι //abstract// και δεν μπορεί να παράγει αντικείμενα, **ακόμη και εάν διαθέτει κατασκευαστή**. Μόνο οι κλάσεις που θα κληρονομήσουν τη συγκεκριμένη κλάση και θα παρέχουν υλοποιήσεις όλων των //pure virtual// μεθόδων θα μπορέσουν να παράγουν αντικείμενα. |
| | |
| Για παράδειγμα, στην κλάση //Shape2D// είναι λογικό να δηλώσουμε την μέθοδο //getArea// ως //pure virtual// (αντί να επιστρέφει μηδέν) μιας και η συγκεκριμένη συνάρτηση δεν έχει νόημα για το κλάση //Shape2D//, αλλά μόνο για τις υποκλάσεις αυτής. Η κλάση //Shape2D// διαμορφώνεται ως εξής: | Για παράδειγμα, στην κλάση //Shape2D// είναι λογικό να δηλώσουμε την μέθοδο //getArea// ως //pure virtual// (αντί να επιστρέφει μηδέν) μιας και η συγκεκριμένη συνάρτηση δεν έχει νόημα για το κλάση //Shape2D//, αλλά μόνο για τις υποκλάσεις αυτής. Η κλάση //Shape2D// διαμορφώνεται ως εξής: |
| |
| } | } |
| |
| unsigned int Shape2D::getColor() { | unsigned int Shape2D::getColor() { return color; } |
| return color; | |
| } | |
| Shape2D::Shape2D(unsigned int c, unsigned char bw) : color(c), borderWidth(bw) {} | Shape2D::Shape2D(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) { | Shape2D::Shape2D(unsigned char red, unsigned char blue, unsigned char green, unsigned char bw) : borderWidth(bw) { setColor(red, blue, green); } |
| setColor(red, blue, green); | |
| } | |
| unsigned char Shape2D::getBorderWidth() { return borderWidth; } | unsigned char Shape2D::getBorderWidth() { return borderWidth; } |
| void Shape2D::setBorderWidth(unsigned char bw) { borderWidth = bw; } | void Shape2D::setBorderWidth(unsigned char bw) { borderWidth = bw; } |
| |
| #endif | #endif |
| </code> | </code> |
| |
| | Αντίστοιχα, η μέθοδος getArea() της κλάσης //Rectangle// διαμορφώνεται ως εξής: |
| | <code cpp> |
| | unsigned int Rectangle::getArea() { |
| | return width * height; |
| | } |
| | </code> |
| | |
| | Επειδή η κλάση //Shape2D// είναι πλέον //abstract// δεν μπορεί να δώσει αντικείμενα. Έτσι η συνάρτηση //main// διαμορφώνεται ως εξής. |
| | <code cpp ShapeUsage.cpp> |
| | #include "Rectangle.cpp" |
| | #include "Triangle.cpp" |
| | |
| | int main() { |
| | Rectangle rectangle(0xffffff, 2, 10, 20); |
| | Shape2D &rect_ref = rectangle, *rect_ptr = &rectangle; |
| | |
| | cout << "Rectangle area: " << rectangle.getArea() << endl; |
| | cout << "Rectangle reference area: " << rect_ref.getArea() << endl; |
| | cout << "Rectangle pointer area: " << rect_ptr->getArea() << endl; |
| | } |
| | </code> |
| |
| |