Πολυμορφισμός. Σήμερα!

Σχετικά έγγραφα
Πολυμορφισμός. Σήμερα! Virtual Κληρονομικότητα Mixin classes Αφηρημένοι τύποι δεδομένων Pure Virtual συναρτήσεις

Κληρονομικότητα. Σήμερα! Κλάση Βάσης Παράγωγη κλάση Απλή κληρονομικότητα Protected δεδομένα Constructors & Destructors overloading

Συναρτήσεις & Κλάσεις

Ειδικά Θέματα Ι. Σήμερα!

Κληρονομικότητα. Σήμερα!

Αναφορές (References)

Συναρτήσεις. Σημερινό μάθημα

Pointers. Σημερινό Μάθημα! Χρήση pointer Τελεστής * Τελεστής & Γενικοί δείκτες Ανάκληση Δέσμευση μνήμης new / delete Pointer σε αντικείμενο 2

Classes. Σημερινό Μάθημα. Constructor και destructor Συναρτήσεις μέλη const Inline συναρτήσεις Δηλώσεις κλάσεων Σύνθετες κλάσεις

Ειδικά Θέματα. Σήμερα. Ισότητα Αντικειμένων Friend classes Operator overloading

public: Horse(){} Horse(double h,string c,string n,int a):animal(n,a){ itsheight=h; itscolor=c; } void fonialogou(){ cout<<"xlimintrisma"<<endl;} };

ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΜΑΘΗΜΑΤΙΚΩΝ ΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ

Αναγνώριση Προτύπων. Σήμερα! Λόγος Πιθανοφάνειας Πιθανότητα Λάθους Κόστος Ρίσκο Bayes Ελάχιστη πιθανότητα λάθους για πολλές κλάσεις

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

Συναρτήσεις ΙΙ. Σημερινό μάθημα

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

Απάντηση. // We write in a header file named my_header.h #ifndef my_header_h #define my_header_h #define divides(x,y) (((y)%(x)==0)?

ΚΛΗΡΟΝΟΜΙΚΟΤΗΤΑ. Σχηματική παράσταση του προγράμματος. logariasmos

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

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

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

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

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

Ερωτήσεις και απαντήσεις στα θέματα του κανονισμού κατάρτισης

Εισαγωγικά. 1.1 Η σ-αλγεβρα ως πληροφορία

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

Στοίβες - Ουρές. Στοίβα (stack) Γιάννης Θεοδωρίδης, Νίκος Πελέκης, Άγγελος Πικράκης Τµήµα Πληροφορικής

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

ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. ΕΡΓΑΣΤΗΡΙΟ C++ ΕΞΑΜΗΝΟ Γ Ακαδηµαϊκό Έτος

21/11/2005 Διακριτά Μαθηματικά. Γραφήματα ΒΑΣΙΚΗ ΟΡΟΛΟΓΙΑ : ΜΟΝΟΠΑΤΙΑ ΚΑΙ ΚΥΚΛΟΙ Δ Ι. Γεώργιος Βούρος Πανεπιστήμιο Αιγαίου

2 using namespace s t d ; 4 { 12 int t= x ; 6 x=y ; 7 y=t ; 8 } 9 11 { 13 x= y ; 14 y=t ; 15 } {

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

Η λέξη κλειδί this. Γαβαλάς Δαμιανός

Ηλεκτρονικοί Υπολογιστές

Aντικειμενοστραφής. Προγραμματισμός. Κληρονομικότητα

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

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

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

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

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

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

Αναγνώριση Προτύπων. Σημερινό Μάθημα

Δυναμική μνήμη με πίνακες και λίστες

Φροντιστήριο 2: Ανάλυση Αλγόριθμου. Νικόλας Νικολάου ΕΠΛ432: Κατανεμημένοι Αλγόριθμοι 1 / 10

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

Κληρονομικότητα. Κληρονομικότητα (inheritance) είναι ο τρόπος µε τον οποίο μία τάξη μπορεί να κληρονομήσει ιδιότητες και συμπεριφορά από άλλες τάξεις.

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

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

Ονοματεπώνυμο και ΑΜ: Είχα παραδώσει εργασίες τα εξής ακαδημαϊκά έτη: Διάρκεια: 2,5 ώρες, κλειστά βιβλία και σημειώσεις ΚΑΛΗ ΕΠΙΤΥΧΙΑ!

Αποδεικτικές Διαδικασίες και Μαθηματική Επαγωγή.

Παραβολή ψ=αχ 2 +βχ+γ, α 0. Η παραβολή ψ = αχ 2. Γενικά : Κάθε συνάρτηση της μορφής ψ=αχ 2 + βχ +γ, α 0 λέγεται τετραγωνική συνάρτηση.

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

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

POINTERS, AGGREGATION, COMPOSITION

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

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

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

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

Τίτλος Μαθήματος: Ηλεκτρονικοί Υπολογιστές IΙΙ. Διδάσκων: Επίκουρος Καθηγητής Αθανάσιος Σταυρακούδης

ΣΤΟ ΦΑΡΜΑΚΕΙΟ. Με την πιστοποίηση του έχει πρόσβαση στο περιβάλλον του φαρμακείου που παρέχει η εφαρμογή.

ΚΛΗΡΟΝΟΜΙΚΟΤΗΤΑ ΚΑΙ ΠΟΛΥΜΟΡΦΙΣΜΟΣ

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

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

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

Εξαναγκασμένες ταλαντώσεις, Ιδιοτιμές με πολλαπλότητα, Εκθετικά πινάκων. 9 Απριλίου 2013, Βόλος

ιαφάνειες παρουσίασης #4

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

Αντικείµενα. ηµιουργία και χρησιµοποίηση αντικειµένων. ηµιουργία αντικειµένων

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. Εαρινό Εξάμηνο

Διάρκεια: 2 ώρες 17/9/2009 ΘΕΜΑΤΑ 1) (2 μονάδες) Δεδομένης της περιγραφής που ακολουθεί δώστε το σχεδιασμό κλάσεων του συστήματος:

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ (Σηµειώσεις Εργαστηρίου)

Οι γέφυρες του ποταμού... Pregel (Konigsberg)

Προγραμματισμός Υπολογιστών με C++ Φύλλο Διαγωνίσματος Ακαδημαϊκό εξάμηνο: Χειμερινό

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

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

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

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

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

ΣΤΟΙΧΕΙΑ ΤΗΣ ΓΛΩΣΣΑΣ C++ Πέρασμα παραμέτρων, συναρτήσεις δόμησης και αποδόμησης

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008

HY 280. θεμελιακές έννοιες της επιστήμης του υπολογισμού ΑΣΚΗΣΕΙΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ. Γεώργιος Φρ.

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

Υπερφόρτωση τελεστών (operator(

ΑΦAΙΡΕΤΙΚΟΣ (ή ΑΦΗΡΗΜΕΝΟΣ) ΤΥΠΟΣ ΔΕΔΟΜΕΝΩΝ (ΑΤΔ) (Abstract Data Type-ADT) - σύνολο δεδομένων (data, objects) - σύνολο πράξεων στα δεδομένα

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

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

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

ιάσταση του Krull Α.Π.Θ. Θεσσαλονίκη Χ. Χαραλαμπους (ΑΠΘ) ιάσταση του Krull Ιανουάριος, / 27

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

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

ΚΑΛΟΥΠΩΜΑΤΑ & ΜΕΤΑΤΡΟΠΕΣ

Εργαστήριο 4: Υλοποίηση Αφηρημένου Τύπου Δεδομένων: Ταξινομημένη Λίστα

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

ΤΥΠΟΣ ΔΕΔΟΜΕΝΩΝ (ΑΤΔ) (Abstract Data Type-ADT)

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΑΣΚΗΣΗ #5 Προτεινόμενη Λύση

Εισαγωγή στα Αντικείμενα

Προγραμματισμός Υπολογιστών με C++ Φύλλο Διαγωνίσματος Ακαδημαϊκό εξάμηνο: Χειμερινό

5.1 Μετρήσιμες συναρτήσεις

Προαπαιτούμενες Ασκήσεις 5 ου Εργαστηρίου. Dose stoixeio (integer) : 25 Found stoixeio in position 7 Dose stoixeio (integer) :94 Value not found

Αναγνώριση Προτύπων. Σημερινό Μάθημα

Transcript:

Πολυμορφισμός Σήμερα! Ανάγκη για Πολυμορφισμό Πολυμορφισμός Constructors σε πολύμορφα αντικείμενα Διπλή συνάρτηση Κοινή κλάση βάσης 2 1

Ανάγκη για Πολυμορφισμό Ας υποθέσουμε ότι με τη βοήθεια της Ιεραρχίας έχουμε χωρίσει την κλάση των ζώων σε πουλιά και θηλαστικά. Η κλάση των πουλιών, Bird, εμπεριέχει τη συνάρτηση Fly(), ενώ στα θηλαστικά ανήκει η κλάση Horse που περιέχει τις συναρτήσεις Whinny() και Gallop(). Έστω ότι χρειαζόμαστε την κλάση Pegasus που χρειάζεται τις συναρτήσεις Fly(), Whinny(), και Gallop(). Ποια πρέπει να είναι η βάση μας; 3 Πολυμορφισμός Είναι δυνατό να παράγουμε μία κλάση από δύο βάσεις: class Pegasus : public Horse, public Bird class Schnoodle : public Schnauzer, public Poodle Αυτό ονομάζεται πολυμορφισμός. Τότε η παραγόμενη κληρονομεί και από τις δύο βάσεις 4 2

Πολυμορφισμός/1 #include <iostream.h> class Horse { Horse() { cout << ʺHorse constructor... ʺ; virtual ~Horse() { cout << ʺHorse destructor... ʺ; virtual void Whinny() const { cout << ʺWhinny!... ʺ; int itsage; ; class Bird { Bird() { cout << ʺBird constructor... ʺ; virtual ~Bird() { cout << ʺBird destructor... ʺ; virtual void Chirp() const { cout << ʺChirp... ʺ; virtual void Fly() const { cout << ʺI can fly! I can fly! I can fly! ʺ; int itsweight; ; 5 Πολυμορφισμός/2 class Pegasus : public Horse, public Bird { void Chirp() const { Whinny(); Pegasus() { cout << ʺPegasus constructor... ʺ; ~Pegasus() { cout << ʺPegasus destructor... ʺ; ; 6 3

Πολυμορφισμός/3 const int MagicNumber = 2; int main() { Horse* Ranch[MagicNumber]; Bird* Aviary[MagicNumber]; Horse * phorse; Bird * pbird; int choice,i; for (i=0; i<magicnumber; i++) { cout << ʺ\n(1)Horse (2)Pegasus: ʺ; cin >> choice; if (choice == 2) phorse = new Pegasus; else phorse = new Horse; Ranch[i] = phorse; 7 Πολυμορφισμός/4 for (i=0; i<magicnumber; i++) { cout << ʺ\n(1)Bird ( ) (2)Pegasus: ʺ; cin >> choice; if (choice == 2) pbird = new Pegasus; else pbird = new Bird; Aviary[i] = pbird; cout << ʺ\nʺ; for (i=0; i<magicnumber; i++) { cout << ʺ\nRanch[ʺ << i << ʺ]: ʺ ; Ranch[i] >Whinny(); delete Ranch[i]; 8 4

Πολυμορφισμός/5 for (i=0; i<magicnumber; i++) { cout << ʺ\nAviary[ʺ << i << ʺ]: ʺ ; Aviary[i] >Chirp(); Aviary[i] >Fly(); delete Aviary[i]; return 0; 9 Πολυμορφισμός/έξοδος (1)Horse (2)Pegasus: 1 Horse constructor... (1)Horse (2)Pegasus: 2 Horse constructor... Bird constructor... Pegasus constructor... (1)Bird (2)Pegasus: 1 Bird constructor... (1)Bird (2)Pegasus: 2 Horse constructor... Bird constructor... Pegasus constructor... Ranch[0]: Whinny!... Horse destructor... Ranch[1]: Whinny!... Pegasus destructor... Bird destructor... Horse destructor... Aviary[0]: Chirp... I can fly! I can fly! I can fly! Bird destructor... Aviary[1]: Whinny!... I can fly! I can fly! I can fly! Pegasus destructor... Bird destructor... Horse destructor... Aviary[0]: Chirp... I can fly! I can fly! I can fly! Bird destructor... Aviary[1]: Whinny!... I can fly! I can fly! I can fly! 10 Pegasus destructor.. Bird destructor... Horse destructor... 5

Constructors σε πολύμορφα αντικείμενα Όταν μία κλάση έχει δύο κλάσεις βάσεις που έχουν δομητές με παραμέτρους πρέπει να τους αρχικοποιεί στη σειρά. 11 Πολλαπλοί constructor/1 #include <iostream.h> typedef int HANDS; enum COLOR { Red, Green, Blue, Yellow, White, Black, Brown ; enum BOOL { FALSE, TRUE ; class Horse { Horse(COLOR color, HANDS height); virtual ~Horse() { cout << ʺHorse destructor...\nʺ; virtual void Whinny()const { cout << ʺWhinny!... ʺ; virtual HANDS GetHeight() const { return itsheight; virtual COLOR GetColor() const { return itscolor; HANDS itsheight; COLOR itscolor; ; 12 6

Πολλαπλοί constructor/2 class Bird { Bird(COLOR color, BOOL migrates); virtual ~Bird() {cout << ʺBird destructor...\nʺ; virtual void Chirp()const { cout << ʺChirp... ʺ; virtual void Fly()const { cout << ʺI can fly! I can fly! I can fly! ʺ; virtual COLOR GetColor()const { return itscolor; virtual BOOL GetMigration() const { return itsmigration; COLOR itscolor; BOOL itsmigration; ; 13 Πολλαπλοί constructor/3 Horse::Horse(COLOR color, HANDS height): itscolor(color),itsheight(height) { cout << ʺHorse constructor...\nʺ; Bird::Bird(COLOR color, BOOL migrates): itscolor(color), itsmigration(migrates) { cout << ʺBird constructor...\nʺ; 14 7

Πολλαπλοί constructor/3 class Pegasus : public Horse, public Bird { void Chirp()const { Whinny(); Pegasus(COLOR, HANDS, BOOL,long); ~Pegasus() {cout << ʺPegasus destructor...\nʺ; virtual long GetNumberBelievers() const { return itsnumberbelievers; long itsnumberbelievers; ; Pegasus::Pegasus(COLOR acolor,hands height,bool migrates, long NumBelieve): Horse(aColor, height),bird(acolor, migrates), itsnumberbelievers(numbelieve) { cout << ʺPegasus constructor...\nʺ; 15 Πολλαπλοί constructor/4 int main() { Pegasus *ppeg = new Pegasus(Red, 5, TRUE, 10); ppeg >Fly(); ppeg >Whinny(); cout << ʺ\nYour Pegasus is ʺ << ppeg >GetHeight(); cout << ʺ hands tall and ʺ; if (ppeg >GetMigration()) cout << ʺit does migrate.ʺ; else cout << ʺit does not migrate.ʺ; cout << ʺ\nA total of ʺ << ppeg >GetNumberBelievers(); cout << ʺ people believe it exists.\nʺ; delete ppeg; return 0; 16 8

Πολλαπλοί constructor/έξοδος Horse constructor... Bird constructor... Pegasus constructor... I can fly! I can fly! I can fly! Whinny!... Your Pegasus is 5 hands tall and it does migrate. A total of 10 people believe it exists. Pegasus destructor... t Bird destructor... Horse destructor... 17 Διπλή συνάρτηση Στην περίπτωση που μία συνάρτηση υπάρχει σε δύο κλάσεις βάσης μιας παραγόμενης κλάσης και κληθεί από την παραγόμενη κλάση, θα προκύψει σφάλμα. Το πρόβλημα μπορεί να ξεπεραστεί με δύο τρόπους: Είτε ορίζοντας ακριβώς ποια συνάρτηση καλούμε COLOR currentcolor = ppeg >Horse::GetColor(); Είτε κάνοντας override τη συνάρτηση στην παραγόμενη κλάση 18 9

Κοινή κλάση βάσης/1 #include <iostream.h> typedef int HANDS; enum COLOR { Red, Green, Blue, Yellow, White, Black, Brown ; enum BOOL { FALSE, TRUE ; class Animal { Animal(int); virtual ~Animal() { cout << ʺAnimal destructor...\nʺ; virtual int GetAge() const { return itsage; virtual void SetAge(int age) { itsage = age; int itsage; ; Animal::Animal(int age): itsage(age) { cout << ʺAnimal constructor...\nʺ; 19 Κοινή κλάση βάσης/2 class Horse : public Animal { Horse(COLOR color, HANDS height, int age); virtual ~Horse() { cout << ʺHorse destructor...\nʺ; virtual void Whinny()const { cout << ʺWhinny!... ʺ; virtual HANDS GetHeight() const { return itsheight; virtual COLOR GetColor() const { return itscolor; protected: HANDS itsheight; COLOR itscolor ; Horse::Horse(COLOR color, HANDS height, int age): Animal(age), itscolor(color),itsheight(height) { cout << ʺHorse constructor...\nʺ; 20 10

Κοινή κλάση βάσης/3 class Bird : public Animal { Bird(COLOR color, BOOL migrates, int age); virtual ~Bird() {cout << ʺBird destructor...\nʺ; virtual void Chirp()const { cout << ʺChirp... ʺ; virtual void Fly()const { cout << ʺI can fly! I can fly! I can fly! ʺ; virtual COLOR GetColor()const { return itscolor; virtual BOOL GetMigration() const { return itsmigration; protected: COLOR itscolor; BOOL itsmigration; ; Bird::Bird(COLOR color, BOOL migrates, int age): Animal(age), itscolor(color), itsmigration(migrates) { cout << ʺBird constructor...\nʺ; 21 Κοινή κλάση βάσης/4 class Pegasus : public Horse, public Bird { void Chirp()const { Whinny(); Pegasus(COLOR, HANDS, BOOL, long, int); ~Pegasus() {cout << ʺPegasus destructor...\nʺ; virtual long GetNumberBelievers() const { return itsnumberbelievers; virtual COLOR GetColor()const { return Horse::itsColor; virtual int GetAge() const { return Horse::GetAge(); long itsnumberbelievers; ; Pegasus::Pegasus(COLOR acolor, HANDS height, BOOL migrates, long NumBelieve, int age): Horse(aColor, height,age), Bird(aColor, migrates,age), itsnumberbelievers(numbelieve) { 22 cout << ʺPegasus constructor...\nʺ; 11

Κοινή κλάση βάσης/5 int main() { Pegasus *ppeg = new Pegasus(Red, 5, TRUE, 10, 2); int age = ppeg >GetAge(); cout << ʺThis pegasus is ʺ << age << ʺ years old.\nʺ; delete ppeg; return 0; 23 Κοινή κλάση βάσης/έξοδος Animal constructor... Horse constructor... Animal constructor... Bird constructor... Pegasus constructor... This pegasus is 2 years old. Pegasus destructor... Bird destructor... Animal destructor... Horse destructor... Animal destructor... 24 12