Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D.

Σχετικά έγγραφα
Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D. Κλάσεις.

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

ΗΓλώσσαΠρογραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D. Ελένη Τουσίδου, Ph.D.

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κληρονομικότητα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κληρονομικότητα

ΗΓλώσσαΠρογραµµατισµού C++ (The C++ Programming Language)

Αντικειμενοστρεφής Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κληρονομικότητα

Προγραμματισμός Ι. Κλάσεις και Αντικείμενα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

ΗΓλώσσαΠρογραµµατισµού C++ (The C++ Programming Language)

Αντικειμενοστραφής Προγραμματισμός

Εργαστήριο Java. Διδάσκουσα: Εργαστηριακοί Συνεργάτες:

Κλάσεις και αντικείμενα #include <iostream.h<

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κληρονομικότητα

Εισαγωγή στον Προγραµµατισµό, Αντώνιος Συµβώνης, ΣΕΜΦΕ, ΕΜΠ,, Slide 6

Εισαγωγή σε αντικειμενοστραφή concepts. Και λίγη C#

Προγραμματισμός Ι. Εισαγωγή στην C++ Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραµµατιστικές τεχνικές

Σύνθεση και Κληρονομικότητα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors

Οντοκεντρικός Προγραμματισμός

ΑΠΛΗ ΚΛΗΡΟΝΟΜΙΚΟΤΗΤΑ

Παύλος Εφραιµίδης. Java. Κληρονοµικότητα

Ενδεικτική περιγραφή μαθήματος

υναµική διαχείριση µνήµης στη C++ Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 2 είκτες

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κληρονομικότητα

Κληρονομικότητα. Παύλος Εφραιμίδης pefraimi <at> ee.duth.gr. Java Κληρονομικότητα 1

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #2

2.1 Αντικειµενοστρεφής προγραµµατισµός

Κλάσεις και Αντικείµενα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Constructors Υπερφόρτωση Αντικείμενα ως παράμετροι

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κληρονομικότητα Πολυμορφισμός Late Binding Αφηρημένες κλάσεις

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κληρονομικότητα Πολυμορφισμός Late Binding

ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡ/ΣΜΟΣ C++

Αντικειμενοστραφείς Γλώσσες Προγραμματισμού C++ / ROOT

public void printstatement() { System.out.println("Employee: " + name + " with salary: " + salary);

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D. Πίνακες.

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πολυμορφισμός Αφηρημένες κλάσεις Interfaces (διεπαφές)

Διαγράμματα Κλάσεων στη Σχεδίαση

Σύνθεση και Κληρονομικότητα

Αρχές Τεχνολογίας Λογισμικού Εργαστήριο

ΜΑΘΗΜΑ: Αντικειμενοστρεφής Προγραμματισμός

Κλάσεις στη Java. Στοίβα - Stack. Δήλωση της κλάσης. ΗκλάσηVector της Java. Ηκλάση Stack

Ειδικά Θέματα Προγραμματισμού

Προγραμματιστικές τεχνικές

Ανάλυση άσκησης. Employee. SalariedEmployee CommissionEmployee HourlyEmployee. BasePlusCommissionEmployee

Το πρόγραμμα HelloWorld.java. HelloWorld. Κλάσεις και Αντικείμενα (2) Ορισμός μιας Κλάσης (1) Παύλος Εφραιμίδης pefraimi <at> ee.duth.

Κλάσεις στη Java. Παύλος Εφραιμίδης. Java Κλάσεις στη Java 1

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κληρονομικότητα Downcasting Πολυμορφισμός Late Binding

ΠΟΛΥΜΟΡΦΙΣΜΟΣ. 4.1 Κληρονομικότητα και Αρχή της Υποκατάστασης

ΗΓλώσσαΠρογραµµατισµού C++ (The C++ Programming Language)

Στοιχειώδης προγραμματισμός σε C++

ΗΓλώσσαΠρογραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D. Ελένη Τουσίδου, Ph.D.

Λογισµικό (Software SW) Γλώσσες

Προγραμματισμός ΙI (Θ)

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Υπερφόρτωση Αντικείμενα σαν ορίσματα

Εαρινό. Ύλη εργαστηρίου, Ασκήσεις Java

ΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ ΘΕΜΑ: «Σχεδιασμός και ανάπτυξη ιστοσελίδων ηλεκτρονικής εκπαίδευσης (e learning) σε θέματα αντικειμενοστραφή προγραμματισμού.

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιεπαφές και Εσωτερικές κλάσεις Interfaces and Inner Classes. ιεπαφές - Interfaces

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 3: Constructors και destructors

Τι είναι κλάση Κλάση

Με τι ασχολείται ο αντικειμενοστραφής προγραμματισμός

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

ΚΑΤΑΣΚΕΥΑΣΤΕΣ ΑΝΤΙΓΡΑΦΗΣ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πολυμορφισμός Αφηρημένες κλάσεις Interfaces (διεπαφές)

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Ευάγγελος Γ. Ούτσιος Θεόδωρος Γ. Λάντζος Διάλεξη Νο2-Νο3

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργία Κλάσεων και Αντικειμένων Constructors

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors, equals, tostring

Διδάσκων: Παναγιώτης Ανδρέου

Οντοκεντρικός Προγραμματισμός

Οντοκεντρικός Προγραμματισμός

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιαχείριση Εξαιρέσεων. Εισαγωγή στη ιαχείριση Εξαιρέσεων

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. Συλλογές και Επαναλήπτες. Συλλογές - Collections

ΑΡΦΕ ΑΝΣΙΚΕΙΜΕΝΟΣΡΕΥΟΤ ΠΡΟΓΡΑΜΜΑΣΙΜΟΤ. Ιωάννης Φατζηλυγερούδης Αναπληρωτής Καθηγητής Τμήμα Μηχ/κών Η/Υ και Πληροφορικής Πανεπιστήμιο Πατρών

Γραφικά υπολογιστών Εργαστήριο 9 Κλάσεις στην Python. Σκοπός της 9ης άσκησης είναι να μάθουμε αντικειμενοστρεφή προγραμματισμό στην Python.

12. ΑΛΦΑΡΙΘΜΗΤΙΚΑ. υο είδη αλφαριθµητικών Τα αλφαριθµητικά της C πίνακες τύπου char Ta αντικείµενα της κλάσης string

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

Οντοκεντρικός Προγραμματισμός

Κατασκευαστές. Μέθοδοι Κατασκευής (Constructors).

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Αντικειμενοστρέφεια. Henri Matisse, Harmony in Red, Κωστής Σαγώνας Νίκος Παπασπύρου

Αντικείμενα στη Java. Παύλος Εφραιμίδης. Java Αντικείμενα στη Java 1

Εισαγωγή στον Προγραμματισμό με C++

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Παράδειγμα χρήσης κληρονομικότητας

Προγραµµατιστικές τεχνικές

Αντικειµενοστρεφής Προγραµµατισµός

Οντοκεντρικός Προγραμματισμός

Παρουσίαση Delphi. Μέμος-Μπαγκράτσας Ιωάννης 1232 Μαργαρίτης Νικόλαος 1226

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

Αντικείμενα (Objects) στην Java. Αντικείμενα στη Java. Δημιουργία Αντικειμένων. Δηλώσεις Μεταβλητών (2) Ο τελεστής new (1)

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D. Αλφαριθµητικά Κλάση string

(Διαφάνειες Νίκου Βιδάκη)

Δομές Δεδομένων & Αλγόριθμοι

ΣΤΟΙΧΕΙΑ ΤΗΣ ΓΛΩΣΣΑΣ C++ Constructors, Destructors, Pointers IO Streams, File Streams

Transcript:

1 Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) ηµήτριος Κατσαρός, Ph.D. Χειµώνας 2005 ιάλεξη 9η Ιστοσελίδα του µαθήµατος 2 http://skyblue.csd.auth.gr/~dimitris/courses/cpp_fall05.htm Θα τοποθετούνται οι διαφάνειες του επόµενου µαθήµατος Επικοινωνία: dimitris@skyblue.csd.auth.gr Περιεχόµενα 3 Κληρονοµικότητα (Inheritance) 1

Στόχοι εκµάθησης 4 Τα βασικά της κληρονοµικότητας Παραγόµενες κλάσεις, µε constructors protected: qualifier Ξανα-ορίζοντας συναρτήσεις-µέλη Μη-κληρονοµούµενες συναρτήσεις Προγραµµατισµός µε κληρονοµικότητα Τελεστής ανάθεσης και copy constructors Destructors σε παραγόµενες κλάσεις Πολλαπλή κληρονοµικότητα Εισαγωγή στην κληρονοµικότητα 5 Αντικειµενοστραφής προγραµµατισµός Ισχυρή τεχνική προγραµµατισµού Παρέχει συνιστώσα αφαίρεσης, την κληρονοµικότητα Ορίζεται γενική µορφή µιας κλάσης Εξειδικευµένες εκδόσεις κατόπιν κληρονοµούν ιδιότητες της γενικής κλάσης Και προσθέτουν/τροποποιούν τη λειτουργικότητά της για κατάλληλη χρήση Τα βασικά της κληρονοµικότητας 6 Μια νέα κλάση κληρονοµείται από µια άλλη Βασική ή Μητρική ή Γονική κλάση (Base class) Γενική κλάση από την οποία γεννιούνται άλλες Παραγόµενη κλάση (Derived class) Νέα κλάση Αυτόµατα έχει από τη βασική κλάση τις: Μεταβλητές-µέλη Συναρτήσεις-µέλη Μπορούµε κατόπιν να προσθέσουµε συναρτήσεις-µέλη και µεταβλητές-µέλη 2

Παραγόµενες κλάσεις 7 Θεωρήστε το παράδειγµα: Κλάση από "Employees" Αποτελείται από: Salaried employees Hourly employees Κάθε οµάδα είναι υποσύνολο από employees Μια άλλη οµάδα µπορεί να είναι εκείνη που περιλαµβάνει εκείνους που πληρώνονται µε σταθερό µισθό κάθε µήνα ή εβδοµάδα Παραγόµενες κλάσεις 8 εν χρειάζεται τύπο για τον γενικό "employee" Αφού κανένας δεν είναι απλώς "employee" Η γενική ιδέα του employee είναι χρήσιµη! Όλοι έχουν ονόµατα Όλοι έχουν αριθµό ταυτότητας Οι συναρτήσεις οι σχετιζόµενες µε αυτά τα βασικά στοιχεία είναι οι ίδιες για όλους τους employees Έτσι η γενική κλάση µπορεί να περιέχει όλα αυτά τα στοιχεία για τους employees Κλάση Employee 9 Πολλά µέλη της κλάσης "employee" εφαρµόζονται για όλους τους τύπους των employees Συναρτήσεις προσπέλασης (Accessor functions) Συναρτήσεις τροποποίησης (Mutator functions) Τα περισσότερα δεδοµένα: SSN Name Pay Όµως δεν θα έχουµε αντικείµενα αυτής της κλάσης 3

Κλάση Employee 10 Θεωρήστε τη συνάρτηση printcheck(): Πάντα θα ξανα-ορίζεται στις παραγόµενες κλάσεις Έτσι διαφορετικoί τύποι Εmployees θα έχουν διαφορετικά checks εν έχει νόηµα να υπάρχει µη-διαφοροποιηµένος Employee Έτσι η συνάρτηση printcheck() στην κλάση Employee απλά λέει ότι Μήνυµα λάθους δηλώνοντας ότι "printcheck called for undifferentiated employee!! Aborting " Παράγοντας από την κλάση Employee 11 Παραγόµενες κλάσεις από την κλάση Employee: Αυτόµατα έχουν όλες τις µεταβλητές-µέλη Αυτόµατα έχουν όλες τις συναρτήσεις-µέλη Θα λέµε ότι η παραγόµενη κλάση κληρονοµεί τα µέλη της βασικής κλάσης Κατόπιν, µπορούµε να ξανα-ορίσουµε τα υπάρχοντα µέλη και/ή να προσθέσουµε νέα µέλη ήλωση παραγόµενης κλάσης HourlyEmployee (1/2) 12 4

ήλωση παραγόµενης κλάσης HourlyEmployee (2/2) 13 Interface της HourlyEmployee 14 Παρατηρήστε ότι ο ορισµός αρχίζει το ίδιο όπως κάθε άλλη #ifndef δοµή Περιλαµβάνει τις απαιτούµενες βιβλιοθήκες Επίσης, περιλαµβάνει την employee.h! Και, το heading: class HourlyEmployee : public Employee { } Καθορίζει publicly inherited από την κλάση Employee Προσθήκες στην HourlyEmployee 15 Το interface της παραγόµενης κλάσης περιλαµβάνει µόνο τα νέα µέλη ή όποια µέλη πρόκειται να ξανα-οριστούν Αφού όλα τα άλλα που κληρονοµούνται έχουν ήδη οριστεί δηλ., όλοι οι employees έχουν ssn, name, κ.τ.λ. Η HourlyEmployee προσθέτει: Constructors Τις µεταβλητές: wagerate, hours member Τις συναρτήσεις-µέλη: setrate(), getrate(), sethours(), gethours() 5

Επαν-ορισµοί στη HourlyEmployee 16 Η HourlyEmployee ξανα-ορίζει: Τη συνάρτηση-µέλος printcheck() Αυτή "overrides" την υλοποίηση της συνάρτησης printcheck() της κλάσης Employee Ο ορισµός της πρέπει να είναι στην υλοποίηση της HourlyEmployee Όπως και οι άλλες συναρτήσεις-µέλη που δηλώνονται στο interface της HourlyEmployee Νέες και ξανα-οριζόµενες Ορολογία κληρονοµικότητας 17 Γονική κλάση (Parent class) Αναφέρεται στη βασική κλάση (base class) Κλάση-παιδί (child class) Αναφέρεται στην παραγόµενη κλάση (derived class) Προγονική κλάση (ancestor class) Κλάση που είναι πατέρας του πατέρα της Απογονική κλάση (descendant class) Αντίθετη της ancestor 18 Constructors παραγόµενων κλάσεων Οι constructors των γονικών κλάσεων ΕΝ κληροδοτούνται στις παραγόµενες κλάσεις! Αλλά µπορούν να εκκινηθούν µέσα στους constructors των παραγόµενων κλάσεων Το οποίο είναι αυτό που επιζητούµε! Ο constructor της γονικής κλάσης πρέπει να εκκινεί όλες τις µεταβλητές-µέλη της γονικής κλάσης Αυτές που κληροδοτούνται Έτσι ο constructor της παραγόµενης κλάσης απλά τον καλεί Το οποίο είναι το πρώτο πράγµα που κάνει ο constructor 6

constructor παραγόµενης κλάσης Θεωρήστε τη σύνταξη για τον constructor της HourlyEmployee: HourlyEmployee::HourlyEmployee(string thename, string thenumber, double thewagerate, double thehours) : Employee(theName, thenumber), wagerate(thewagerate), hours(thehours) { //Ίσως κενό } Το τµήµα µετά το: είναι το τµήµα εκκίνησης Περιλαµβάνει την invocation του Employee constructor 19 constructor παραγόµενης κλάσης 20 εύτερος constructor: HourlyEmployee::HourlyEmployee() : Employee(), wagerate(0), hours(0) { //Deliberately empty } Καλείται ο εξ ορισµού (default) constructor της γονικής κλάσης Πάντα θα πρέπει να καλούµε έναν από τους constructors της γονικής κλάσης 21 Μη κλήση του γονικού constructor Ο constructor της παραγόµενης κλάσης θα πρέπει πάντα να καλεί έναν από τους constructors της γονικής κλάσης Εάν δεν τον καλέσουµε: Καλείται αυτόµατα ο default constructor της γονικής κλάσης Ισοδύναµος ορισµός του constructor: HourlyEmployee::HourlyEmployee() : wagerate(0), hours(0) { } 7

Παγίδα: Ιδιωτικά δεδοµένα της γονικής κλάσης 22 Η παραγόµενη κλάση κληρονοµεί τις ιδιωτικές µεταβλητές-µέλη Αλλά δεν µπορούµε να τις προσπελάσουµε Ούτε διαµέσου των συναρτήσεων-µελών της παραγόµενης κλάσης! Οι ιδιωτικές µεταβλητές-µέλη µπορούν να προσπελαστούν µε όνοµα ΜΟΝΟ από συναρτήσεις-µέλη της κλάσης όπου αυτές ορίζονται Παγίδα: Ιδιωτικές συναρτήσεις-µέλη της γονικής κλάσης 23 Το ίδιο ισχύει για τις συναρτήσεις-µέλη της γονικής κλάσης εν µπορούν να προσπελαστούν εκτός του interface και της υλοποίησης της γονικής κλάσης Ούτε και στους ορισµούς των συναρτήσεων- µελών της παραγόµενης κλάσης Παγίδα: Επίδραση των ιδιωτικών συναρτήσεων-µελών γονικής κλάσης 24 Μεγαλύτερη επίδραση εδώ vs. µεταβλητές-µέλη Οι µεταβλητές-µέλη µπορούν να προσπελαστούν έµµεσα διαµέσου των accessor ή mutator συναρτήσεων-µελών Οι συναρτήσεις-µέλη απλά δεν είναι διαθέσιµες Είναι λογικό Οι ιδιωτικές συναρτήσεις-µέλη θα πρέπει απλά να είναι βοηθητικές συναρτήσεις Θα πρέπει να χρησιµοποιούνται µόνο στην κλάση όπου ορίζονται 8

Ο προσδιοριστής protected 25 Νέα κατηγοριοποίηση των µελών µιας συνάρτησης Επιτρέπει προσπέλαση µε όνοµα στην παραγόµενη κλάση Αλλά πουθενά αλλού Όχι προσπέλαση µε όνοµα σε άλλες κλάσεις Στην κλάση όπου ορίζεται ενεργεί ως ιδιωτικό Θεωρούνται "protected" στην παραγόµενη κλάση Για να επιτρέψει µελλοντικές παραγόµενες κλάσεις Με πρώτη µατιά, φαίνεται να παραβιάζει την αρχή της απόκρυψης πληροφορίας Επαν-ορισµοί συναρτήσεων-µελών 26 Θυµηθείτε το interface της παραγόµενης κλάσης: Περιέχει δηλώσεις για νέες συναρτήσεις-µέλη Επίσης, περιέχει δηλώσεις για κληρονοµούµενες συναρτήσεις-µέλη που θα τροποποιηθούν Οι κληρονοµούµενες συναρτήσεις-µέλη που ΕΝ δηλώνονται: Αυτόµατα κληρονοµούνται αµετάβλητες Η υλοποίηση της παραγόµενης κλάσης θα: Ορίσει νέες συναρτήσεις-µέλη Θα ξανα-ορίσει κληρονοµούµενες συναρτήσεις Επαν-ορισµός vs. Υπερφόρτωση 27 Εντελώς διαφορετικές έννοιες και µηχανισµοί! Επαν-ορισµός στην παραγόµενη κλάση: Ι ΙΑ λίστα παραµέτρων Ουσιαστικά, ξαναγράφεται η ίδια συνάρτηση Υπερφόρτωση: ιαφορετική λίστα παραµέτρων Η νέα συνάρτηση παίρνει διαφορετικές παραµέτρους Οι υπερφορτωµένες συναρτήσεις θα πρέπει να έχουν διαφορετικές υπογραφές 9

Υπογραφή συνάρτησης 28 Θυµηθείτε τον ορισµό της υπογραφής µιας συνάρτησης: Όνοµα της συνάρτησης Ακολουθία των τύπων στη λίστα των παραµέτρων Περιλαµβάνοντας τη σειρά, αριθµό, τύπους Η υπογραφή ΕΝ περιλαµβάνει: Τύπο επιστροφής Τη λέξη-κλειδί const & Προσπελάζοντας τη ξανα-ορισµένη συνάρτηση µιας γονικής κλάσης 29 Όταν µια συνάρτηση ξανα-ορίζεται σε µια παραγόµενη κλάση, ο ορισµός της στη γονική κλάση, δεν χάνεται Μπορούµε να καθορίσουµε τη χρήση της: Employee JaneE; HourlyEmployee SallyH; JaneE.printCheck(); calls Employee s printcheck function SallyH.printCheck(); calls HourlyEmployee printcheck function SallyH.Employee::printCheck(); Calls Employee s printcheck function! εν είναι σύνηθες, αλλά χρήσιµο µερικές φορές 30 Συναρτήσεις που δεν κληρονοµούνται Όλες οι κανονικές συναρτήσεις µιας γονικής κλάσης κληροδοτούνται στις παραγόµενες Εξαιρέσεις: Constructors Destructors Copy constructor Αλλά εάν δεν οριστεί, γεννά έναν εξ ορισµού Θυµηθείτε ότι πρέπει να ορίζουµε έναν για τους pointers! Assignment operator If not defined default 10

Τελεστές ανάθεσης και copy constructors 31 Θυµηθείτε: οι υπερφορτωµένοι τελεστές ανάθεσης και οι copy constructors ΕΝ κληρονοµούνται Αλλά µπορούν να χρησιµοποιηθούν στον ορισµός της παραγόµενης κλάσης Τυπικά ΠΡΕΠΕΙ να χρησιµοποιηθούν! Όµοια µε το πώς ο constructor µιας παραγόµενης κλάσης εκκινεί τον constructor της γονικής κλάσης Παράδειγµα τελεστή ανάθεσης 32 Έστω ότι η "Derived" κλάση παράγεται από τη "Base": Derived& Derived::operator =(const Derived & rightside) { Base::operator =(rightside); } Προσέξτε τη γραµµή του κώδικα Καλεί τον τελεστής ανάθεσης της γονικής κλάσης Αυτό τακτοποιεί όλες τις κληρονοµούµενες µεταβλητές Κατόπιν, θα θέσει τις νέες µεταβλητές της παραγόµενης κλάσης Παράδειγµα copy constructor 33 Θεωρήστε το: Derived::Derived(const Derived& Object) : Base(Object), { } Μετά το : είναι η invocation του γονικού copy constructor Θέτει τις κληρονοµούµενες µεταβλητές-µέλη του αντικειµένου της παραγόµενης κλάσης που δηµιουργείται Παρατηρήστε ότι το Object είναι τύπου Derived; Αλλά είναι επίσης και τύπου Base, έτσι το όρισµα είναι έγκυρο 11

34 Destructors σε παραγόµενες κλάσεις Εάν ο destructor της βασικής κλάσης λειτουργεί κανονικά Είναι εύκολο να γραφεί ο destructor της παραγόµενης Όταν ενεργοποιηθεί ο destructor της παραγόµενης: Καλεί αυτόµατα τον destructor της βασικής κλάσης! Έτσι, δεν υπάρχει η ανάγκη σαφούς κλήσης Έτσι, οι destructors των παραγόµενων κλάσεων χρειάζεται να ανησυχούν µόνο για τις µεταβλητές της παραγόµενης κλάσης Και για όποια δεδοµένα στα οποία δείχνουν Ο destructor της βασικής κλάσης χειρίζεται αυτόµατα τα κληρονοµούµενα δεδοµένα Σειρά κλήσης των destructors 35 Θεωρήστε το: η κλάση B παράγεται από την κλάση A η κλάση C παράγεται από την κλάση B A B C Όταν ένα αντικείµενο της κλάσης C βγεί out of scope : Καλείται πρώτα ο destructor της κλάσης C Κατόπιν, καλείται ο destructor της κλάσης B Τελικά, καλείται ο destructor της κλάσης A Αντίθετα από τη σειρά κλήσης των constructors Γενικότερη αρχή: Resource acquisition is Initialization Σχέσεις "Is a" vs. "Has a" 36 Κληρονοµικότητα Θεωρείται ως µια σχέση Is a µεταξύ των κλάσεων π.χ., Ένας HourlyEmployee "is a" Employee Μια κλάση περιέχει αντικείµενα άλλης κλάσης ως δικά της µέλη Θεωρείται ως µια σχέση Has a µεταξύ των κλάσεων π.χ., Μια κλάση "has a" αντικείµενο άλλης κλάσης ως δεδοµένα της 12

Protected & private κληρονοµικότ. 37 Νέες µορφές κληρονοµικότητας Χρησιµοποιούνται σπάνια Protected κληρονοµικότητα: class SalariedEmployee : protected Employee { } Τα public µέλη της βασικής κλάσης γίνονται protected µέλη στην παραγόµενη κλάση Private κληρονοµικότητα: class SalariedEmployee : private Employee { } Όλα τα µέλη της βασικής κλάσης γίνονται private στην παραγόµενη κλάση Πολλαπλή κληρονοµικότητα 38 Μια παραγόµενη κλάση µπορεί να έχει περισσότερες από µια βασικές κλάσεις! Η σύνταξη απαιτεί ότι απαριθµούνται όλες οι βασικές κλάσεις διαχωριζόµενες µε κόµµα: class derivedmulti : public base1, base2 { } Πιθανότητες για ambiguity είναι ατελείωτες! Επικίνδυνη η αξιοποίησή της! Αρκετοί πιστεύουν ότι δεν πρέπει να χρησιµοποιείται καθόλου Σίγουρα χρειάζεται αρκετή εµπειρία για τη χρήση της! Περίληψη 1 39 Η κληρονοµικότητα παρέχει επαναχρησιµοποίηση κώδικα Επιτρέπει µια κλάσης να παραχθεί από κάποια άλλη µε την προσθήκη χαρακτηριστικών Τα αντικείµενα παραγόµενων κλάσεων κληρονοµούν τα µέλη της µητρικής κλάσης Και µπορούν να προσθέτουν µέλη Οι ιδιωτικές µεταβλητές της µητρικής κλάσης δεν µπορούν να προσπελαστούν µε το όνοµα από τις παραγόµενές της Οι ιδιωτικές συναρτήσεις-µέλη δεν κληρονοµούνται 13

Περίληψη 2 40 Μπορούµε να ξανα-ορίσουµε τις κληρονοµούµενες συναρτήσεις-µέλη Για να εκτελούν διαφορετικές λειτουργίες στη παραγόµενη κλάση Τα protected µέλη στη µητρική κλάση: Μπορούν να προσπελαστούν µε το όνοµα στις συναρτήσεις-µέλη της παραγόµενης κλάσης Ο υπερφορτωµένος τελεστής ανάθεσης δεν κληρονοµείται Αλλά µπορεί να εκκινηθεί από την παραγόµενη κλάση Οι constructors δεν κληρονοµούνται Εκκινούνται από τον constructor της παραγόµενης κλάσης 14