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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡ/ΣΜΟΣ 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 (διεπαφές)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Σχεδίαση Εφαρμογών και Υπηρεσιών Διαδικτύου 7 η Διάλεξη: Σύντομη εισαγωγή στην Java

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

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

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

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

Μέθοδοι. Μέθοδοι ηµιουργοί, Υπερφόρτωση και Υπέρβαση Μεθόδων

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

Βασικά της γλώσσας JAVA

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

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

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

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

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

Κεφάλαιο 3.1, : Συναρτήσεις I. ( ιάλεξη 11) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Κλάσεις. Κατηγορίες Αντικειµένων. Κλάσεις. Φυσικά Αντικείµενα. Χώρος = Οµάδα Φυσικών Αντικειµένων. Πρόγραµµα = Οµάδα

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

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

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

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

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)

4 Στόχοι εκµάθησης Τα βασικά της κληρονοµικότητας Παραγόµενες κλάσεις, µε constructors protected: qualifier Ξανα-ορίζοντας συναρτήσεις-µέλη Μη-κληρονοµούµενες συναρτήσεις Προγραµµατισµός µε κληρονοµικότητα Τελεστής ανάθεσης και copy constructors Destructors σε παραγόµενες κλάσεις Πολλαπλή κληρονοµικότητα

5 Εισαγωγή στην κληρονοµικότητα Αντικειµενοστραφής προγραµµατισµός Ισχυρή τεχνική προγραµµατισµού Παρέχει συνιστώσα αφαίρεσης, την κληρονοµικότητα Ορίζεται γενική µορφή µιας κλάσης Εξειδικευµένες εκδόσεις κατόπιν κληρονοµούν ιδιότητες της γενικής κλάσης Και προσθέτουν/τροποποιούν τη λειτουργικότητά της για κατάλληλη χρήση

6 Τα βασικά της κληρονοµικότητας Μια νέα κλάση κληρονοµείται από µια άλλη Βασική ή Μητρική ή Γονική κλάση (Base class) Γενική κλάση από την οποία γεννιούνται άλλες Παραγόµενη κλάση (Derived class) Νέα κλάση Αυτόµατα έχει από τη βασική κλάση τις: Μεταβλητές-µέλη Συναρτήσεις-µέλη Μπορούµε κατόπιν να προσθέσουµε συναρτήσεις-µέλη και µεταβλητές-µέλη

7 Παραγόµενες κλάσεις Θεωρήστε το παράδειγµα: Κλάση από "Employees" Αποτελείται από: Salaried employees Hourly employees Κάθε οµάδα είναι υποσύνολο από employees Μια άλλη οµάδα µπορεί να είναι εκείνη που περιλαµβάνει εκείνους που πληρώνονται µε σταθερό µισθό κάθε µήνα ή εβδοµάδα

8 Παραγόµενες κλάσεις εν χρειάζεται τύπο για τον γενικό "employee" Αφού κανένας δεν είναι απλώς "employee" Η γενική ιδέα του employee είναι χρήσιµη! Όλοι έχουν ονόµατα Όλοι έχουν αριθµό ταυτότητας Οι συναρτήσεις οι σχετιζόµενες µε αυτά τα βασικά στοιχεία είναι οι ίδιες για όλους τους employees Έτσι η γενική κλάση µπορεί να περιέχει όλα αυτά τα στοιχεία για τους employees

9 Κλάση Employee Πολλά µέλη της κλάσης "employee" εφαρµόζονται για όλους τους τύπους των employees Συναρτήσεις προσπέλασης (Accessor functions) Συναρτήσεις τροποποίησης (Mutator functions) Τα περισσότερα δεδοµένα: SSN Name Pay Όµως δεν θα έχουµε αντικείµενα αυτής της κλάσης

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

Παράγοντας από την κλάση 11 Employee Παραγόµενες κλάσεις από την κλάση Employee: Αυτόµατα έχουν όλες τις µεταβλητές-µέλη Αυτόµατα έχουν όλες τις συναρτήσεις-µέλη Θα λέµε ότι η παραγόµενη κλάση κληρονοµεί τα µέλη της βασικής κλάσης Κατόπιν, µπορούµε να ξανα-ορίσουµε τα υπάρχοντα µέλη και/ή να προσθέσουµε νέα µέλη

ήλωση παραγόµενης κλάσης 12 HourlyEmployee (1/2)

ήλωση παραγόµενης κλάσης 13 HourlyEmployee (2/2)

14 Interface της HourlyEmployee Παρατηρήστε ότι ο ορισµός αρχίζει το ίδιο όπως κάθε άλλη #ifndef δοµή Περιλαµβάνει τις απαιτούµενες βιβλιοθήκες Επίσης, περιλαµβάνει την employee.h! Και, το heading: class HourlyEmployee : public Employee { } Καθορίζει publicly inherited από την κλάση Employee

15 Προσθήκες στην HourlyEmployee Το interface της παραγόµενης κλάσης περιλαµβάνει µόνο τα νέα µέλη ή όποια µέλη πρόκειται να ξανα-οριστούν Αφού όλα τα άλλα που κληρονοµούνται έχουν ήδη οριστεί δηλ., όλοι οι employees έχουν ssn, name, κ.τ.λ. Η HourlyEmployee προσθέτει: Constructors Τις µεταβλητές: wagerate, hours member Τις συναρτήσεις-µέλη: setrate(), getrate(), sethours(), gethours()

16 Επαν-ορισµοί στη HourlyEmployee Η 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

19 constructor παραγόµενης κλάσης Θεωρήστε τη σύνταξη για τον constructor της HourlyEmployee: HourlyEmployee::HourlyEmployee(string thename, string thenumber, double thewagerate, double thehours) : Employee(theName, thenumber), wagerate(thewagerate), hours(thehours) { //Ίσως κενό } Το τµήµα µετά το: είναι το τµήµα εκκίνησης Περιλαµβάνει την invocation του Employee constructor

20 constructor παραγόµενης κλάσης εύτερος constructor: HourlyEmployee::HourlyEmployee() : Employee(), wagerate(0), hours(0) { //Deliberately empty } Καλείται ο εξ ορισµού (default) constructor της γονικής κλάσης Πάντα θα πρέπει να καλούµε έναν από τους constructors της γονικής κλάσης

Μη κλήση του γονικού constructor 21 Ο constructor της παραγόµενης κλάσης θα πρέπει πάντα να καλεί έναν από τους constructors της γονικής κλάσης Εάν δεν τον καλέσουµε: Καλείται αυτόµατα ο default constructor της γονικής κλάσης Ισοδύναµος ορισµός του constructor: HourlyEmployee::HourlyEmployee() : wagerate(0), hours(0) { }

Παγίδα: Ιδιωτικά δεδοµένα της 22 γονικής κλάσης Η παραγόµενη κλάση κληρονοµεί τις ιδιωτικές µεταβλητές-µέλη Αλλά δεν µπορούµε να τις προσπελάσουµε Ούτε διαµέσου των συναρτήσεων-µελών της παραγόµενης κλάσης! Οι ιδιωτικές µεταβλητές-µέλη µπορούν να προσπελαστούν µε όνοµα ΜΟΝΟ από συναρτήσεις-µέλη της κλάσης όπου αυτές ορίζονται

Παγίδα: Ιδιωτικές συναρτήσεις-µέλη 23 της γονικής κλάσης Το ίδιο ισχύει για τις συναρτήσεις-µέλη της γονικής κλάσης εν µπορούν να προσπελαστούν εκτός του interface και της υλοποίησης της γονικής κλάσης Ούτε και στους ορισµούς των συναρτήσεων- µελών της παραγόµενης κλάσης

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

25 Ο προσδιοριστής protected Νέα κατηγοριοποίηση των µελών µιας συνάρτησης Επιτρέπει προσπέλαση µε όνοµα στην παραγόµενη κλάση Αλλά πουθενά αλλού Όχι προσπέλαση µε όνοµα σε άλλες κλάσεις Στην κλάση όπου ορίζεται ενεργεί ως ιδιωτικό Θεωρούνται "protected" στην παραγόµενη κλάση Για να επιτρέψει µελλοντικές παραγόµενες κλάσεις Με πρώτη µατιά, φαίνεται να παραβιάζει την αρχή της απόκρυψης πληροφορίας

26 Επαν-ορισµοί συναρτήσεων-µελών Θυµηθείτε το interface της παραγόµενης κλάσης: Περιέχει δηλώσεις για νέες συναρτήσεις-µέλη Επίσης, περιέχει δηλώσεις για κληρονοµούµενες συναρτήσεις-µέλη που θα τροποποιηθούν Οι κληρονοµούµενες συναρτήσεις-µέλη που ΕΝ δηλώνονται: Αυτόµατα κληρονοµούνται αµετάβλητες Η υλοποίηση της παραγόµενης κλάσης θα: Ορίσει νέες συναρτήσεις-µέλη Θα ξανα-ορίσει κληρονοµούµενες συναρτήσεις

27 Επαν-ορισµός vs. Υπερφόρτωση Εντελώς διαφορετικές έννοιες και µηχανισµοί! Επαν-ορισµός στην παραγόµενη κλάση: Ι ΙΑ λίστα παραµέτρων Ουσιαστικά, ξαναγράφεται η ίδια συνάρτηση Υπερφόρτωση: ιαφορετική λίστα παραµέτρων Η νέα συνάρτηση παίρνει διαφορετικές παραµέτρους Οι υπερφορτωµένες συναρτήσεις θα πρέπει να έχουν διαφορετικές υπογραφές

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

Τελεστές ανάθεσης και copy 31 constructors Θυµηθείτε: οι υπερφορτωµένοι τελεστές ανάθεσης και οι copy constructors ΕΝ κληρονοµούνται Αλλά µπορούν να χρησιµοποιηθούν στον ορισµός της παραγόµενης κλάσης Τυπικά ΠΡΕΠΕΙ να χρησιµοποιηθούν! Όµοια µε το πώς ο constructor µιας παραγόµενης κλάσης εκκινεί τον constructor της γονικής κλάσης

32 Παράδειγµα τελεστή ανάθεσης Έστω ότι η "Derived" κλάση παράγεται από τη "Base": Derived& Derived::operator =(const Derived & rightside) { Base::operator =(rightside); } Προσέξτε τη γραµµή του κώδικα Καλεί τον τελεστής ανάθεσης της γονικής κλάσης Αυτό τακτοποιεί όλες τις κληρονοµούµενες µεταβλητές Κατόπιν, θα θέσει τις νέες µεταβλητές της παραγόµενης κλάσης

33 Παράδειγµα copy constructor Θεωρήστε το: Derived::Derived(const Derived& Object) : Base(Object), { } Μετά το : είναι η invocation του γονικού copy constructor Θέτει τις κληρονοµούµενες µεταβλητές-µέλη του αντικειµένου της παραγόµενης κλάσης που δηµιουργείται Παρατηρήστε ότι το Object είναι τύπου Derived; Αλλά είναι επίσης και τύπου Base, έτσι το όρισµα είναι έγκυρο

34 Destructors σε παραγόµενες κλάσεις Εάν ο destructor της βασικής κλάσης λειτουργεί κανονικά Είναι εύκολο να γραφεί ο destructor της παραγόµενης Όταν ενεργοποιηθεί ο destructor της παραγόµενης: Καλεί αυτόµατα τον destructor της βασικής κλάσης! Έτσι, δεν υπάρχει η ανάγκη σαφούς κλήσης Έτσι, οι destructors των παραγόµενων κλάσεων χρειάζεται να ανησυχούν µόνο για τις µεταβλητές της παραγόµενης κλάσης Και για όποια δεδοµένα στα οποία δείχνουν Ο destructor της βασικής κλάσης χειρίζεται αυτόµατα τα κληρονοµούµενα δεδοµένα

35 Σειρά κλήσης των destructors Θεωρήστε το: η κλάση B παράγεται από την κλάση A η κλάση C παράγεται από την κλάση B A B C Όταν ένα αντικείµενο της κλάσης C βγεί out of scope : Καλείται πρώτα ο destructor της κλάσης C Κατόπιν, καλείται ο destructor της κλάσης B Τελικά, καλείται ο destructor της κλάσης A Αντίθετα από τη σειρά κλήσης των constructors Γενικότερη αρχή: Resource acquisition is Initialization

36 Σχέσεις "Is a" vs. "Has a" Κληρονοµικότητα Θεωρείται ως µια σχέση Is a µεταξύ των κλάσεων π.χ., Ένας HourlyEmployee "is a" Employee Μια κλάση περιέχει αντικείµενα άλλης κλάσης ως δικά της µέλη Θεωρείται ως µια σχέση Has a µεταξύ των κλάσεων π.χ., Μια κλάση "has a" αντικείµενο άλλης κλάσης ως δεδοµένα της

37 Protected & private κληρονοµικότ. Νέες µορφές κληρονοµικότητας Χρησιµοποιούνται σπάνια Protected κληρονοµικότητα: class SalariedEmployee : protected Employee { } Τα public µέλη της βασικής κλάσης γίνονται protected µέλη στην παραγόµενη κλάση Private κληρονοµικότητα: class SalariedEmployee : private Employee { } Όλα τα µέλη της βασικής κλάσης γίνονται private στην παραγόµενη κλάση

38 Πολλαπλή κληρονοµικότητα Μια παραγόµενη κλάση µπορεί να έχει περισσότερες από µια βασικές κλάσεις! Η σύνταξη απαιτεί ότι απαριθµούνται όλες οι βασικές κλάσεις διαχωριζόµενες µε κόµµα: class derivedmulti : public base1, base2 { } Πιθανότητες για ambiguity είναι ατελείωτες! Επικίνδυνη η αξιοποίησή της! Αρκετοί πιστεύουν ότι δεν πρέπει να χρησιµοποιείται καθόλου Σίγουρα χρειάζεται αρκετή εµπειρία για τη χρήση της!

39 Περίληψη 1 Η κληρονοµικότητα παρέχει επαναχρησιµοποίηση κώδικα Επιτρέπει µια κλάσης να παραχθεί από κάποια άλλη µε την προσθήκη χαρακτηριστικών Τα αντικείµενα παραγόµενων κλάσεων κληρονοµούν τα µέλη της µητρικής κλάσης Και µπορούν να προσθέτουν µέλη Οι ιδιωτικές µεταβλητές της µητρικής κλάσης δεν µπορούν να προσπελαστούν µε το όνοµα από τις παραγόµενές της Οι ιδιωτικές συναρτήσεις-µέλη δεν κληρονοµούνται

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