Αντικειμενοστρεφής Προγραμματισμός Ενότητα 6: Φιλικές συναρτήσεις Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)
Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς. 2
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο TEI Δυτικής Μακεδονίας και στην Ανώτατη Εκκλησιαστική Ακαδημία Θεσσαλονίκης» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους. 3
Σκοποί Ενότητας Εξοικείωση με τις έννοιες των Φιλικών συναρτήσεων, του Πολυμορφισμού Γνώση της χρήσης και διάκρισης των Εικονικών (virtual) και των Αμιγώς εικονικών συναρτήσεων (pure virtual). 4
Περιεχόμενα Φιλικές συναρτήσεις Πολυμορφισμός Εικονικές συναρτήσεις (virtual) Αμιγώς εικονικές συναρτήσεις (pure virtual). 5
Φιλικές συναρτήσεις Μια φιλική συνάρτηση ΔΕΝ είναι συνάρτηση-μέλος μιας κλάσης. Ωστόσο, έχει άμεση πρόσβαση στις private και protected μεταβλητές αλλά και στις συναρτήσεις της κλάσης. Μια συνάρτηση χρειάζεται να είναι φιλική μιας κλάσης, μόνο αν πρέπει να έχει πρόσβαση σε ιδιωτικά μέλη της κλάσης αυτής. Χρειαζόμαστε ξεχωριστή έκδοση υπερφόρτωσης τελεστή, ανάλογα με το είδος ή το πλήθος των παραμέτρων 6
Ο δείκτης this Όταν καλείται μια συνάρτηση (μέθοδος) μιας κλάσης, τότε στην συνάρτηση αυτή μεταβιβάζεται αυτόματα ένας δείκτης που ονομάζεται: this, ο οποίος δείχνει στο αντικείμενο το οποίο κάλεσε την συνάρτηση. Ο δείκτης this, έχει εμβέλεια μόνο μέσα στην συνάρτηση αυτή και μπορεί να χρησιμοποιηθεί για να έχει έμμεση πρόσβαση στα μέλη του αντικειμένου που την κάλεσε. Η τιμή του δείκτη this, δεν μπορεί να αλλαχθεί. Ο δείκτης this, δεν μεταβιβάζεται στις φιλικές συναρτήσεις μιας κλάσης (ούτε στις στατικές). 7
Πολυμορφισμός (1) Υποθέστε ότι έχουμε δημιουργήσει 2 κλάσεις, που η μία είναι απόγονος της άλλης. π.χ. κλάση-γονέας: Car και κλάση-απόγονος: SportsCar Και στη συνέχεια δηλώνουμε 2 αντικείμενα, ένα για κάθε κλάση: Car c( Volvo, 220); SportsCar sc( Porsche, 350, 400); Αν βάλουμε τον δείκτη Car να δείξει σε αντικείμενο SportsCar: Car *cptr = ≻ τότε η κλήση της συνάρτησης print() μέσω ενός δείκτη της βασικής (γονικής) κλάσης (της Car) ενεργοποιεί πάντα την print() της γονικής κλάσης, ΑΣΧΕΤΩΣ αν ο δείκτης δείχνει σε αντικείμενο της κλάσηςαπογόνου, όπως παραπάνω. 8
Πολυμορφισμός (2) Όμως θα θέλαμε, ο δείκτης να είναι της βασικής κλάσης αλλά να καλείται η σωστή συνάρτηση print() ανάλογα με το αντικείμενο στο οποίο δείχνει αυτός ο δείκτης. Δηλαδή, αν το αντικείμενο είναι τύπου Car να καλείται η Car::print(), ενώ αν το αντικείμενο είναι τύπου SportsCar να καλείται η SportsCar::print(). Αν η συνάρτηση print() δηλωθεί σαν εικονική ή υπερβατή (virtual) στη βασική κλάση, θα το πετύχουμε: class Car { private:... public:... virtual void print(); }; 9
Εικονικές συναρτήσεις (virtual) Υπάρχουν περιπτώσεις όπου δεν θέλουμε να δημιουργήσουμε αντικείμενα από μια κλάση. Οι κλάσεις αυτού του είδους ονομάζονται αφηρημένες (abstract). Σκοπός της ύπαρξής της είναι να αποτελέσει μια βασική κλάση από την οποία οι παράγωγες κλάσεις (απόγονοι) θα υιοθετήσουν χαρακτηριστικά (μεταβλητές) και συμπεριφορά (συναρτήσεις). 10
Αμιγώς εικονικές συναρτήσεις (pure virtual) Μια κλάση καθίσταται αφηρημένη αν δηλώσουμε μία ή περισσότερες από τις virtual συναρτήσεις σαν αμιγείς (pure). Μια αμιγώς εικονική (pure virtual) συνάρτηση είναι εκείνη που όταν τη δηλώνουμε, την αρχικοποιούμε ως ίση με μηδέν. 11
Βιβλιογραφία Δημήτρης Συνδουκάς 2007, Αντικειμενοστρεφής προγραμματισμός με C++ - Ασκήσεις, Εσωτερική έκδοση του ΤΕΙ Νίκος Μ. Χατζηγιαννάκης 2008, Η Γλώσσα C++ σε βάθος (1η έκδοση), ΚΛΕΙΔΑΡΙΘΜΟΣ ΕΠΕ, Αθήνα [ISBN: 978-960-461-143-0] Walter Savitch. 2011, Πλήρης C++ (1η έκδοση), Α. ΤΖΙΟΛΑ & ΥΙΟΙ Ο.Ε., Αθήνα, [ISBN: 978-960-418-358-6] Herbert Schildt 2005, C++ Βήμα προς Βήμα (2η έκδοση), Α. ΤΖΙΟΛΑ & ΥΙΟΙ Ο.Ε., Αθήνα, [ISBN: 960-512-449-1] Harvey M.Deitel, Paul J. Deitel, 2011, C++ Προγραμματισμός (6η έκδοση), Γκιούρδας Μ., Αθήνα, [ISBN: 978-960-512-5912] Jesse Liberty 2006, Πλήρες Εγχειρίδιο της C++ (Πέμπτη έκδοση), Γκιούρδας Μ., Αθήνα, [ISBN: 978-960-512-318-5] Deitel Paul J.,Deitel Harvey M., Java Προγραμματισμός, 8 η έκδοση, Εκδόσεις Χ. Γκιούρδα και ΣΙΑ, 2008, ISBN: 978-960-512-592-9. Savitch Walter, Java, 4 η έκδοση, 2007, Εκδόσεις Α. Τζιόλα και Υιοί, ISBN: 978-960-418-147-6. 12
Τέλος Ενότητας
Σημείωμα Αδειοδότησης Το παρόν υλικό διατίθεται με τους όρους της άδειας χρήσης Creative Commons Αναφορά, Μη Εμπορική Χρήση Παρόμοια Διανομή 4.0 [1] ή μεταγενέστερη, Διεθνής Έκδοση. Εξαιρούνται τα αυτοτελή έργα τρίτων π.χ. φωτογραφίες, διαγράμματα κ.λ.π., τα οποία εμπεριέχονται σε αυτό και τα οποία αναφέρονται μαζί με τους όρους χρήσης τους στο «Σημείωμα Χρήσης Έργων Τρίτων». [1] http://creativecommons.org/licenses/by-nc-sa/4.0/ Ως Μη Εμπορική ορίζεται η χρήση: που δεν περιλαμβάνει άμεσο ή έμμεσο οικονομικό όφελος από την χρήση του έργου, για το διανομέα του έργου και αδειοδόχο. που δεν περιλαμβάνει οικονομική συναλλαγή ως προϋπόθεση για τη χρήση ή πρόσβαση στο έργο. που δεν προσπορίζει στο διανομέα του έργου και αδειοδόχο έμμεσο οικονομικό όφελος (π.χ. διαφημίσεις) από την προβολή του έργου σε διαδικτυακό τόπο. Ο δικαιούχος μπορεί να παρέχει στον αδειοδόχο ξεχωριστή άδεια να χρησιμοποιεί το έργο για εμπορική χρήση, εφόσον αυτό του ζητηθεί. 14
Διατήρηση Σημειωμάτων Οποιαδήποτε αναπαραγωγή ή διασκευή του υλικού θα πρέπει να συμπεριλαμβάνει: το Σημείωμα Αναφοράς. το Σημείωμα Αδειοδότησης. τη δήλωση Διατήρησης Σημειωμάτων. το Σημείωμα Χρήσης Έργων Τρίτων (εφόσον υπάρχει). μαζί με τους συνοδευόμενους υπερσυνδέσμους. 15