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

Σχετικά έγγραφα
Η Γλώσσα Προγραµµατισµού 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) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D.

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

Streams Input / Output in C++ George Kastrinis

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

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

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

S, (5, -3, 34, -23, 7) ( *, _

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

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

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

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

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

Αρχεία & Ρεύματα ΑΡΧΕΙΑ & ΡΕΥΜΑΤΑ. Γεώργιος Παπαϊωάννου ( ) gepap@aueb.gr

Χωρική Βάση δεδοµένων Autocad

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

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

Εισαγωγή στην πληροφορική

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

18. ΡΕΥΜΑΤΑ(STREAMS) ΚΑΙ ΑΡΧΕΙΑ (FILES)

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

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

Εντολές εισόδου - εξόδου. Εισαγωγή στη C++

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

Επεξεργασία Αρχείων Κειµένου

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

Η Γλώσσα Προγραµµατισµού 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++ Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 2 είκτες

Εισαγωγή στη C++ Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα:

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

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

Προγραμματισμός Υπολογιστών με C++

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

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

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

ΠΡΟΤΥΠΑ. ΠΑΡΑ ΕΙΓΜΑ ηµιουργία πρότυπου στοίβας (stack) και στη συνέχεια δηµιουργία µιας στοίβας σηµείων.

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

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

Δομή Προγράμματος C++, Χειρισμός Μεταβλητών και Συναρτήσεις Εισόδου - Εξόδου

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

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

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

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

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

Αρχεία Ένα αρχείο αποτελείται από μία σειρά ομοειδών δεδομένων που ονομάζονται λογικές εγγραφές (logical record)

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

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

Συμβολοσειρές ΣΥΜΒΟΛΟΣΕΙΡΕΣ. Γεώργιος Παπαϊωάννου ( )

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης

Προγραμματισμός Υπολογιστών με C++

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

17TimeThis.h function returns reference pointer to same object { return *this; }

Αναφορές, είκτες και Αλφαριθμητικά

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

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

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

ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ. Τι περιλαμβάνει μια μεταβλητή; ΔΕΙΚΤΕΣ. Διεύθυνση μεταβλητής. Δείκτης

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

Γ7.1 Επανάληψη ύλης Β Λυκείου. Γ Λυκείου Κατεύθυνσης

Γλώσσα Προγραμματισμού C++ Εισαγωγή - Μια πρώτη ματιά

Διάλεξη 2. Μεταβλητές - Δομές Δεδομένων - Eίσοδος δεδομένων - Έξοδος: Μορφοποίηση - Συναρτήσεις. Διοργάνωση : ΚΕΛ ΣΑΤΜ

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (Programming in the large)

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

Γ7.2 Συμβολοσειρές (Strings) Γ Λυκείου Κατεύθυνσης

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

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

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

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

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

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

Περιεχόμενα. Λίγα λόγια για αυτή την έκδοση... 23

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

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 8 : H γλώσσα προγραµµατισµού Pascal 1 ο Μέρος σηµειώσεων (Ενότητες 8.1 & 8.2 σχολικού βιβλίου)

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

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

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

(Κεφάλαιο 2.7 και 12) Αρχεία στην C. (Διάλεξη 15)

C: Από τη Θεωρία στην Εφαρµογή 2 ο Κεφάλαιο

scanf() scanf() stdin scanf() printf() int float double %lf float

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

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

Κεφάλαιο 8.7. Πίνακες & Συναρτήσεις ( ιάλεξη 17) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

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

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

Η εντολή if-else. Η απλή μορφή της εντολής if είναι η ακόλουθη: if (συνθήκη) { Η γενική μορφή της εντολής ifelse. εντολή_1; εντολή_2;..

Κεφάλαιο 2.6: Είσοδος / Έξοδος εδοµένων, Μορφοποίηση εδοµένων Εξόδου. ( ιάλεξη 7) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΚΑΙ ΠΙΝΑΚΕΣ

10 η Διάλεξη C++ - Πίνακες. Δρ. Χρήστος Δρόσος ΑΕΙ ΠΕΙΡΑΙΑ ΤΤ ΤΜΗΜΑ ΑΥΤΟΜΑΤΙΣΜΟΥ

Συναρτήσεις και Πίνακες

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή

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

5. ΣΥΝΑΡΤΗΣΕΙΣ. (Πρόχειρο σχέδιο - Μαθήµατος 3) p Συναρτήσεις, που δεν επιστρέφουν κάποια τιµή

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

Transcript:

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

2 Ιστοσελίδα του µαθήµατος http://skyblue.csd.auth.gr/~dimitris/courses/cpp_fall06.htm Θα τοποθετούνται οι διαφάνειες του επόµενου µαθήµατος Επικοινωνία: dimitris@skyblue.csd.auth.gr etousido@uth.gr

3 Περιεχόµενα Ρεύµατα Εισόδου/Εξόδου

4 Στόχοι εκµάθησης Ρεύµατα I/O I/Oαρχείων I/Oχαρακτήρων Εργαλεία για I/O ρευµάτων Ονόµατα αρχείων ως είσοδος Μορφοποίηση εξόδου, ρυθµίσεις των flags Ιεραρχίες ρευµάτων Πρώτη γνωριµία µε την κληρονοµικότητα Τυχαία προσπέλαση σε αρχεία

5 Εισαγωγικά Ρεύµατα Ειδικά αντικείµενα ιανέµουν την είσοδο/έξοδο του προγράµµατος I/Oαρχείων Χρησιµοποιεί κληρονοµικότητα (στην επόµενη διάλεξη) I/O αρχείων εξαιρετικά χρήσιµη

6 Ρεύµατα (streams) Ροή χαρακτήρων Ρεύµα εισόδου Ρέει µέσα στο πρόγραµµα Προέρχεται από το πληκτρολόγιο Προέρχεται από αρχείο Ρεύµαεξόδου Ρέει έξω από το πρόγραµµα Πηγαίνει στην οθόνη Πηγαίνει σε αρχείο

7 Χρήση των ρευµάτων Έχουµε ήδηχρησιµοποιήσει ρεύµατα cin Ρεύµα εισόδου συνδεδεµένο στο πληκτρολόγιο cout Ρεύµα εξόδου συνδεδεµένο στην οθόνη Μπορούµεναορίσουµενέαρεύµατα Προς ή από αρχεία Χρησιµοποιούνται παρόµοια µεταcin, cout

8 Χρήση ρευµάτων όπως των cin, cout Θεωρήστε το: εδοµένο πρόγραµµα ορίζει το ρεύµα instream που προέρχεται από κάποιο αρχείο: int thenumber; instream >> thenumber; ιαβάζει τιµή απότορεύµα και την αναθέτει στη µεταβλητή thenumber Το πρόγραµµα ορίζειτορεύµα outstream που πηγαίνει σε κάποιο αρχείο outstream << "thenumber is " << thenumber; Γράφει τιµήστορεύµα, που πηγαίνει σε ένα αρχείο

9 Αρχεία Θα χρησιµοποιήσουµεαρχείακειµένου (text files) Ανάγνωση από αρχείο Όταν το πρόγραµµα δέχεται είσοδο Εγγραφή σε αρχείο Όταν το πρόγραµµα στέλνει έξοδο Επεξεργασία από την αρχή µέχρι το τέλος του αρχείου Άλλες διαθέσιµες µέθοδοι θα ασχοληθούµε µε την προσπέλαση σε αυτό το απλό αρχείο

10 Σύνδεση σε αρχείο Πρέπει πρώτα να συνδέσουµετοαντικείµενο ρεύµατος (stream object) σε ένα αρχείο (file) Για είσοδο: File αντικείµενο ifstream Για έξοδο: File αντικείµενο ofstream Οι κλάσεις ifstream και ofstream Ορίζονται στη βιβλιοθήκη <fstream> Στο namespace std

11 Βιβλιοθήκες I/O αρχείων Για να επιτρέψουµε είσοδοκαιέξοδο από/προς αρχεία στο πρόγραµµά µας: #include <fstream> using namespace std; Ή #include <fstream> using std::ifstream; using std::ofstream;

12 ήλωση ρευµάτων Το ρεύµα πρέπει να δηλωθεί όπως κάθε άλλη µεταβλητή τύπου κλάσης: ifstream instream; ofstream outstream; Κατόπιν, πρέπει να συνδεθεί σε ένα αρχείο: instream.open("infile.txt"); Αποκαλείται άνοιγµα του αρχείου Χρησιµοποιεί τη συνάρτηση-µέλος open Μπορούµε να καθορίσουµε όνοµα πλήρους διαδροµής (full pathname)

13 Χρήση ρευµάτων Αφού δηλωθεί χρησιµοποιείται κανονικά! int onenumber, anothernumber; instream >> onenumber >> anothernumber; Όµοια για την έξοδο του ρεύµατος: ofstream outstream; outstream.open("outfile.txt"); outstream << "onenumber = " << onenumber << " anothernumber = " << anothernumber; Στέλνει τα items στοαρχείοεξόδου

14 Ονόµατα αρχείων Προγράµµατα και αρχεία Τα αρχεία έχουν δυο ονόµατα στα προγράµµατά µας Εξωτερικό όνοµααρχείου Αποκαλείται επίσης φυσικό όνοµααρχείου Όπως το "infile.txt" Μερικές φορές θεωρείται το πραγµατικό όνοµα αρχείου" Χρησιµοποιείται µόνο µια φορά στο πρόγραµµα (για να ανοιχτεί το αρχείο) Όνοµαρεύµατος Αποκαλείται επίσης λογικό όνοµααρχείου Το πρόγραµµα χρησιµοποιεί αυτό το όνοµα για τις λειτουργίες του

15 Κλείσιµοαρχείων Τα αρχεία πρέπει να κλείνουν When program completed getting input or sending output Disconnects stream from file Στην πράξη: instream.close(); outstream.close(); Σηµειώστε ότι δεν υπάρχουν ορίσµατα Τα αρχεία κλείνουν αυτόµατα όταν τερµατιστεί το πρόγραµµά µας

16 Άδειασµα (Flush) αρχείου Συχνά η έξοδος είναι "buffered" Αποθηκεύεται προσωρινά πριν σταλεί στο αρχείο Γράφεται σε οµάδες Περιστασιακά, ίσως χρειαστεί να εξαναγκάσουµε την εγγραφή στο αρχείο, δηλ., το άδειασµατων buffers: outstream.flush(); Συνάρτηση-µέλος flush, για όλα τα ρεύµατα εξόδου Όλη η buffered output γράφεται στο αρχείο Το κλείσιµο του αρχείου καλεί αυτόµατα την flush()

17 Παράδειγµα I/O αρχείου (1/2)

18 Παράδειγµα I/O αρχείου (2/2)

Προσθήκη στο τέλος (append) αρχείου 19 Η τυπική λειτουργία open ξεκινά µεάδειοαρχείο Ακόµα και εάν το αρχείο υπάρχει τα περιεχόµενα χάνονται (overwritten) Λειτουργία open για προσθήκη στο τέλος (append): ofstream outstream; outstream.open("important.txt", ios::app); Εάντοαρχείοδενυπάρχει το δηµιουργεί Εάντοαρχείουπάρχει προσθέτει στο τέλος Το 2 ο όρισµα είναιµια σταθερά ορισµένη στην κλάση ios Στη βιβλιοθήκη <iostream>, και στο namespace std

20 Άλλη σύνταξη για άνοιγµα αρχείου Μπορούµε να καθορίσουµετοόνοµατουαρχείου στη δήλωση Περνάει ως όρισµα στονconstructor ifstream instream; instream.open("infile.txt"); ΙΣΟ ΥΝΑΜΟ ΜΕ ΤΟ: ifstream instream("infile.txt");

Έλεγχος για επιτυχές άνοιγµα 21 αρχείου File opens θα µπορούσαν να αποτύχουν Εάν το αρχείο εισόδου δεν υπάρχει εν έχουµε δικαίωµα εγγραφής στο αρχείο εξόδου Απρόβλεπτες καταστάσεις Συνάρτηση-µέλος fail() Κάνουµε κλήση στη fail() για να ελέγξουµε την επιτυχία της λειτουργίας στο ρεύµα instream.open("stuff.txt"); if (instream.fail()) { cout << "File open failed.\n"; exit(1); }

22 I/O χαρακτήρων µε αρχεία Όλες οι λειτουργίες I/O χαρακτήρων µε cin και cout ίδιες και µε τα αρχεία! Οι συναρτήσεις-µέλη δουλεύουν το ίδιο: get, getline put, putback, peek, ignore

23 Έλεγχος τέλους αρχείου: Τρόπος 1 ος Χρήση βρόχου για επεξεργασία του αρχείου µέχρι να τελειώσει Τυπική προσέγγιση υο τρόποι για να ελέγξουµε γιατέλοςαρχείου Συνάρτηση-µέλος eof() instream.get(next); while (!instream.eof()) { cout << next; instream.get(next); } ιαβάζει κάθε χαρακτήρα µέχρι να τελειώσει το αρχείο Ησυνάρτηση-µέλος eof() επιστρέφει bool

24 Έλεγχος τέλους αρχείου: Τρόπος 2 ος εύτερη µέθοδος Ηλειτουργίαread επιστρέφει τιµή bool! (instream >> next) Η έκφραση επιστρέφει true εάν η read είναι επιτυχής Επιστρέφει false εάν προσπαθήσει να διαβάσει πέρα απότοτέλοςτουαρχείου Στην πράξη: double next, sum = 0; while (instream >> next) sum = sum + next; cout << "the sum is " << sum << endl;

25 Ονόµατα αρχείων ως είσοδος Λειτουργία open για ρεύµα Το όρισµαστηνopen() είναι τύπου string Μπορεί να είναι literal (όπως µέχρι τώρα) ή µεταβλητή char filename[16]; ifstream instream; cout << "Enter file name: "; cin >> filename; instream.open(filename); Παρέχει ευελιξία

Μορφοποίηση εξόδου µε συναρτήσεις 26 Έχουµε χρησιµοποιήσει σε παράδειγµατα: cout.setf(ios::fixed); cout.setf(ios::showpoint); cout.precision(2); Τυπώνει τους αριθµούς σε µορφή χρήµατος (12.52) Μπορεί να χρησιµοποιηθεί σε οποιοδήποτε ρεύµα εξόδου Τα ρεύµατα αρχείων (file streams) έχουν τις ίδιες συναρτήσεις-µέλη µε τοαντικείµενο cout

27 Συναρτήσεις-µέλη για έξοδο (1/2) Θεωρήστε τα: outstream.setf(ios::fixed); outstream.setf(ios::showpoint); outstream.precision(2); Ησυνάρτηση-µέλος precision(x) Οι δεκαδικοί γράφονται µε "x" ψηφία µετά την υποδιαστολή Ησυνάρτηση-µέλος setf() Επιτρέπει πολλές από τις flags εξόδου να τεθούν σε κάποια τιµή

28 Συναρτήσεις-µέλη για έξοδο (2/2) Θεωρήστε το: outstream.width(5); Ησυνάρτηση-µέλος width(x) Θέτει το πλάτος σε "x" για την τιµή εξόδου Επηρεάζει µόνο την επόµενη τιµήστηνέξοδο Πρέπει να θέτουµε τοwidth πριν από κάθε τιµή ώστε να επηρεαστούν όλες Είναι τυπικό να έχουµε µεταβλητά widths Γιαναφτιάξουµε στήλες

29 Flags Θυµηθείτε: ησυνάρτηση-µέλος setf() Θέτει την κατάσταση των flags εξόδου Όλαταρεύµατα εξόδου έχουν µέλος τη setf() Οι flags είναι σταθερές στην κλάση ios Στη βιβλιοθήκη <iostream>, στο namespace std

30 Παραδείγµατα µετηsetf() Συνήθεις σταθερές flag: outstream.setf(ios::fixed); Θέτει τον συµβολισµό fixed-point (δεκαδική αναπαράσταση) outstream.setf(ios::showpoint) Να περιλαµβάνεται πάντα η υποδιαστολή outstream.setf(ios::right); Θέτει δεξιά στοίχιση Θέτουµεπολλέςflags µε µια κλήση: outstream.setf(ios::fixed ios::showpoint ios::right);

31 ιαχειριστές (Manipulators) Ως διαχειριστής (manipulator) ορίζεται: Μια συνάρτηση που καλείται µε µη-παραδοσιακό τρόπο Μπορεί να έχει ορίσµατα Τοποθετείται µετά τον τελεστή εισαγωγής Κάνουν τα ίδια πράγµατα όπως και οι συναρτήσεις-µέλη! Με διαφορετικό τρόπο Είναι σύνηθες να τους χρησιµοποιούµε µαζί Οι setw() και setprecision() βρίσκονται στη βιβλιοθήκη <iomanip>, στο namespace std

32 Παράδειγµα διαχειριστή: setw() Ο διαχειριστής setw(): cout << "Start" << setw(4) << 10 << setw(4) << 20 << setw(6) << 30; Προκύπτει το: Start 10 20 30 Σηµειώστε ότι: η setw() επηρεάζει µόνο την επόµενη τιµήεξόδου Πρέπει να περιλαµβάνουµε τηνsetw() πριν από κάθε item εξόδου, ώστε να επηρεαστούν όλα

33 Ο διαχειριστής setprecision() Ο διαχειριστής setprecision(): cout.setf(ios::fixed ios::showpoint); cout << "$" << setprecision(2) << 10.3 << " " << "$" << 20.5 << endl; Προκύπτει το: $10.30 $20.50

34 Αποθήκευση των τιµών των Flag Οι τιµές των flags παραµένουν µέχρι να αλλαχτούν Οι flags precision και setf µπορούν να αποθηκευτούν και να ανακτηθούν Ησυνάρτησηprecision() επιστρέφει την τρέχουσα τιµή, εάν κληθεί χωρίς ορίσµατα Ησυνάρτηση-µέλος flags() παρέχει παρόµοια λειτουργικότητα

35 Παράδειγ. αποθήκευσης τιµών flag void outputstuff(ofstream& outstream) { int precisionsetting = outstream.precision(); long flagsettings = outstream.flags(); outstream.setf(ios::fixed ios::showpoint); outstream.precision(2); outstream.precision(precisionsetting); outstream.flags(flagsettings); } Συνάρτηση για αποθήκευση και ανάκτηση τυπικών ρυθµίσεων Κλήση: outputstuff(mystream);

36 Ανακτώντας τις εξ ορισµού τιµές Μπορούµεναανακτήσουµε τιςεξ ορισµού ρυθµίσεις: cout.setf(0, ios::floatfield); εν είναι αναγκαστικά οι τελευταίες ρυθµίσεις! Οι εξ ορισµού ρυθµίσεις εξαρτώνται από την υλοποίηση εν κάνει reset τις ρυθµίσεις της precision Μόνο τις ρυθµίσεις της setf

37 Ιεραρχίες ρευµάτων Σχέσεις κλάσεων Παράγεται από Μια κλάση προέρχεται από άλλη κλάση Κατόπιν προστίθονται χαρακτηριστικά Παράδειγµα: ηλ.: το ifstream παράγεται από το istream

38 Κληρονοµικότητα κλάσεων ρευµάτων Θεωρήστε το: Εάν η D είναι παραγόµενη κλάση της B Όλατααντικείµενα τύπου D είναι επίσης αντικείµενα τύπου B Σε ότι αφορά τα ρεύµατα: Ένα αντικείµενο ifstream είναι επίσης ένα αντικείµενο istream Θα πρέπει να χρησιµοποιούµε αντικείµενα istream ως παραµέτρους Έτσι περισσότερα αντικείµενα µπορούν να περαστούν ως παράµετροι!

Παράδειγµα κληρονοµικότητας κλάσεων 39 ρευµάτων

Κληρονοµικότητα κλάσεων 40 ρευµάτων: Παραδείγµατα κλήσεων Θεωρώντας τις προηγούµενες συναρτήσεις: twosumversion1(filein); // Νόµιµο! twosumversion1(cin); // Παράνοµο! Επειδή η cin δεν είναι τύπου ifstream! twosumversion2(filein); twosumversion2(cin); // Νόµιµο! // Νόµιµο! Πιο ευέλικτο Ηπαράµετρος istream δέχεται και τα δυο αντικείµενα

41 Τυχαία προσπέλαση σε αρχεία Σειριακή προσπέλαση Η πιο συχνά χρησιµοποιούµενη µέθοδος Τυχαία προσπέλαση Γρήγορη προσπέλαση στις εγγραφές Για µεγάλες βάσεις Προσπελάζει τυχαία οποιοδήποτε µέρος του αρχείου Χρήση των αντικειµένων fstream Είσοδος και έξοδος

42 Εργαλεία τυχαίας προσπέλασης Ανοίγει όµοια µε istream ή ostream Έχει δεύτερο όρισµα fstream rwstream; rwstream.open("stuff", ios::in ios:: out); Ανοίγει µεδυνατότηταread και write Μετακίνηση µέσα σε ένα αρχείο rwstream.seekp(1000); Τοποθετεί τον put-pointer στο 1000 th byte rwstream.seekg(1000); Τοποθετεί τον get-pointer στο 1000 th byte

43 Μεγέθη για τυχαία προσπέλαση Για να µετακινούµαστε πρέπει να γνωρίζουµε τα µεγέθη Ο τελεστής sizeof() προσδιορίζει τον αριθµό τωνbytes που απαιτούνται για ένα αντικείµενο: sizeof(s) //Where s is string s = "Hello" sizeof(10) sizeof(double) sizeof(myobject) Τοποθετεί τον put-pointer στην 100 th εγγραφή των αντικειµένων: rwstream.seekp(100*sizeof(myobject) 1);

44 Περίληψη 1 Τα ρεύµατα συνδέονται σε αρχεία µε τη λειτουργία open Ησυνάρτηση-µέλος fail() ελέγχει την επιτυχία ιάφορες συναρτήσεις-µέλη µορφοποιούν την έξοδο π.χ., width, setf, precision Ίδια χρήση της cout (οθόνη) ήαρχεία Οι τύποι ρευµάτων (stream) µπορεί να είναι παράµετροι Πρέπει να περνάνε ως call-by-reference

45 Περίληψη 2 istream (χωρίς f ) παράµετροι δέχονται αντικείµενα cin ήαντικείµενα ifstream ως ορίσµατα ostream (χωρίς f ) παράµετροι δέχονται αντικείµενα cout ήαντικείµενα ofstream ως ορίσµατα Συνάρτηση-µέλος eof Χρησιµοποιείται για να ελέγξει για το τέλος του αρχείου εισόδου

46 Περιεχόµενα Κληρονοµικότητα (Inheritance)

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

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

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

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

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

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

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

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

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

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

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

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

59 Επαν-ορισµοί στη HourlyEmployee Η HourlyEmployee ξανα-ορίζει: Τη συνάρτηση-µέλος printcheck() Αυτή "overrides" την υλοποίηση της συνάρτησης printcheck() της κλάσης Employee Οορισµός της πρέπει να είναι στην υλοποίηση της HourlyEmployee Όπως και οι άλλες συναρτήσεις-µέλη που δηλώνονται στο interface της HourlyEmployee Νέες και ξανα-οριζόµενες

60 Ορολογία κληρονοµικότητας Γονική κλάση (Parent class) Αναφέρεται στη βασική κλάση (base class) Κλάση-παιδί (child class) Αναφέρεται στην παραγόµενη κλάση (derived class) Προγονική κλάση (ancestor class) Κλάση που είναι πατέρας του πατέρα της Απογονική κλάση (descendant class) Αντίθετη της ancestor

61 Constructors παραγόµενων κλάσεων Οι constructors των γονικών κλάσεων ΕΝ κληροδοτούνται στις παραγόµενες κλάσεις! Αλλά µπορούν να εκκινηθούν µέσα στους constructors των παραγόµενων κλάσεων Το οποίο είναι αυτό που επιζητούµε! Ο constructor της γονικής κλάσης πρέπει να εκκινεί όλες τις µεταβλητές-µέλη της γονικής κλάσης Αυτές που κληροδοτούνται Έτσι ο constructor της παραγόµενης κλάσης απλά τον καλεί Το οποίο είναι το πρώτο πράγµαπουκάνειοconstructor

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

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

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

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

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

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

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

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

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

71 Υπογραφή συνάρτησης Θυµηθείτε τον ορισµό της υπογραφής µιας συνάρτησης: Όνοµα της συνάρτησης Ακολουθία των τύπων στη λίστα των παραµέτρων Περιλαµβάνοντας τη σειρά, αριθµό, τύπους Η υπογραφή ΕΝ περιλαµβάνει: Τύπο επιστροφής Τη λέξη-κλειδί const &

Προσπελάζοντας τη ξανα-ορισµένη 72 συνάρτηση µιας γονικής κλάσης Όταν µια συνάρτηση ξανα-ορίζεται σε µια παραγόµενη κλάση, οορισµός της στη γονική κλάση, δεν χάνεται Μπορούµε να καθορίσουµε τηχρήσητης: 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! εν είναι σύνηθες, αλλά χρήσιµο µερικές φορές

Συναρτήσεις που δεν κληρονοµούνται 73 Όλες οι κανονικές συναρτήσεις µιας γονικής κλάσης κληροδοτούνται στις παραγόµενες Εξαιρέσεις: Constructors Destructors Copy constructor Αλλά εάν δεν οριστεί, γεννά έναν εξ ορισµού Θυµηθείτε ότι πρέπει να ορίζουµεένανγιατουςpointers! Assignment operator If not defined default

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

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

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

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

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

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

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

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

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

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