Πολυμορφισμός. Σήμερα! 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;} };

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

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

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

Αναγνώριση Προτύπων. Σήμερα! Λόγος Πιθανοφάνειας Πιθανότητα Λάθους Κόστος Ρίσκο 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)?

Struct : public by default but Class: private by default. ClassPoint { Struct Point { Public: Double x; Double x; Double y; Double y;

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

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

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

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

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

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

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 9 : ΑΦΗΡΗΜΕΝΕΣ ΚΛΑΣΕΙΣ

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

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

Wrapper Classes, Abstract Classes and Interfaces

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

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

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

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

Δομές ελέγχου ροής προγράμματος

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

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

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

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

Έννοια. Η αποδοχή της κληρονομίας αποτελεί δικαίωμα του κληρονόμου, άρα δεν

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

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 8 : ΚΛΗΡΟΝΟΜΙΚΟΤΗΤΑ & ΠΟΛΥΜΟΡΦΙΣΜΟΣ

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

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

(2) Thread Thread. Runnable. ( ) Java. Sample91. Thread Thread ) Thread. Runnable. run() / run() Runnnale ( ) MyRun implements Runnable Runnable

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

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

Διάλεξη 16-17: Πολυμορφισμός (Polymorphism) Διδάσκων: Παναγιώτης Ανδρέου

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

POINTERS, AGGREGATION, COMPOSITION

ΗΥ-150. Προγραμματισμός

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

ΗΥ-150. Προγραμματισμός

Αρχές Προγραμματισμού

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

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

Προγραμματισμός Διαδικτύου

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

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

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

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

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

1 ΕΙΣΑΓΩΓΗ. Πρωταρχικοί Τύποι

Abstract classes, Interfaces ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA

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

Graphics.h Διασύνδεση με τη Βιβλιοθήκη Γραφικών

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

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

Παίρνοντας Αποφάσεις 1

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

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

Abstract classes, Interfaces ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA

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 } {

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

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

1 η Προαπαιτούµενη. Κάθε οµάδα θα δηµιουργήσει ένα πρόγραµµα, µε πιο «πολύπλοκη» κληρονοµικότητα µε ιεραρχίες ή και πολλαπλή κληρονοµικότητα.

Διάλεξη 3: Προγραμματισμός σε JAVA I. Διδάσκων: Παναγιώτης Ανδρέου

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

Ενδεικτικές Λύσεις σε Επιλεγμένα Θέματα της C++

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

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

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

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

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

ΘΕΜΑΤΑ ΕΞΕΤΑΣΕΩΝ ΟΜΑΔΑ Α

ΕΠΛ233 ΠΛΗΡΟΦΟΡΙΑ ΤΥΠΟΥ. Type Information. Μ. Δικαιάκος

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

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός. Παναγιώτης Σφέτσος

ΨΗΦΙΑΚΑ ΗΛΕΚΤΡΟΝΙΚΑ Σχεδίαση Λογικών Κυκλωμάτων

Παρακάτω δίνεται o σκελετός προγράμματος σε γλώσσα C. Σχολιάστε κάθε γραμμή του κώδικα.

Ενδεικτικές Λύσεις σε Επιλεγμένα Θέματα της C++

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

Δομημένος Προγραμματισμός (ΤΛ1006)

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

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

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

Transcript:

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

Virtual Κληρονομικότητα Η χρήση μιας virtual κλάσης βάσης μας επιτρέπει τη χρήση κοινών συναρτήσεων ορισμένων ως virtual στη βάση, χωρίς να δημιουργεί πολλαπλά αντίγραφα. Κανονικά, ο δομητής μιας κλάσης, αρχικοποιεί μόνο τις μεταβλητές της κλάσης του και τη βάση του. Οι virtual κλάσεις βάσης αποτελούν εξαίρεση καθώς αρχικοποιούνται και από την τελευταία στη σειρά παραγόμενη κλάση. 3 Virtual Κληρονομικότητα/1 #include <iostream.h> typedef int HANDS; enum COLOR RdG Red, Green, Blue, Yll 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ʺ; 4 2

Virtual Κληρονομικότητα/2 class Horse : virtual public Animal Horse(COLOR color, HANDS hihti 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ʺ; 5 Virtual Κληρονομικότητα/3 class Bird : virtual 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ʺ; 6 3

Virtual Κληρονομικότητα/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; long itsnumberbelievers; ; Pegasus::Pegasus(COLOR acolor,hands height,bool migrates, long NumBelieve, int age): Horse(aColor, height,age), Bird(aColor, migrates,age), Animal(age*2), itsnumberbelievers(numbelieve) cout << ʺPegasus constructor...\nʺ; 7 Virtual Κληρονομικότητα/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; Output: Animal constructor... Horse constructor... ctor Bird constructor... Pegasus constructor... This pegasus is 4 years old. Pegasus destructor... Bird destructor... Horse destructor... Animal destructor... 8 4

Δήλωση κλάσεων για virtual κληρονομικότητα Για να διασφαλίσουμε ότι οι παραγόμενες κλάσεις διατηρούν ένα μόνο αντίγραφο κοινών συναρτήσεων των κλάσεων βάσης, δηλώνουμε τις κλάσεις βάσης ως παραγόμενες από μια virtual βάση. 9 Πολυμορφισμός Χρησιμοποιήστε Πολυμορφισμό όταν μία κλάση χρειάζεται συναρτήσεις και στοιχεία από περισσότερες της μιας κλάσης. Υπάρχουν compilers που δεν υποστηρίζουν τον πολυμορφισμό. Μη χρησιμοποιείται πολυμορφισμό όταν δε χρειάζεται ή όταν σας καλύπτει η απλή κληρονομικότητα γιατί αυξάνει την πολυπλοκότητα του προγράμματος Αρχικοποιήστε τη virtual κλάση βάσης από την τελευταία στην ιεραρχία παραγόμενη κλάση. 10 5

Mixins classes Η Mixin class προσθέτει λειτουργικότητα ενώ δεν προσθέτει πολλά δεδομένα. Οι mixin classes προστίθενται σε μία παραγόμενη κλάση με public κληρονομικότητα. Αποτελούν συμβιβασμό μεταξύ απλής και πολλαπλής κληρονομικότητας. Η διαφορά τους από τις άλλες κλάσεις είναι ότι περιέχουν ελάχιστα ή καθόλου δεδομένα. 11 Αφηρημένοι τύποι δεδομένων/1 #include <iostream.h> enum BOOL FALSE, TRUE ; class Shape Shape() ~Shape() virtual long GetArea() return 1; // error virtual long GetPerim() return 1; virtual void Draw() ; 12 6

Αφηρημένοι τύποι δεδομένων/2 class Circle : public Shape Circle(int radius):itsradius(radius) ~Circle() long GetArea() return 3 * itsradius * itsradius; long GetPerim() return 9 * itsradius; void Draw(); int itsradius; int itscircumference; ; void Circle::Draw() cout << ʺCircle drawing routine here!\nʺ; 13 Αφηρημένοι τύποι δεδομένων/3 class Rectangle : public Shape Rectangle(int tlen, int width): itslength(len), itswidth(width) ~Rectangle() virtual long GetArea() return itslength * itswidth; virtual long GetPerim() return 2*itsLength + 2*itsWidth; virtual int GetLength() return itslength; virtual int GetWidth() return itswidth; virtual void Draw(); int itswidth; int itslength; ; void Rectangle::Draw() for (int i = 0; i<itslength; i++) for (int j = 0; j<itswidth; j++) cout << ʺx ʺ; cout << ʺ\nʺ; 14 7

Αφηρημένοι τύποι δεδομένων/4 class Square : public Rectangle Square(int tl len); Square(int len, int width); ~Square() long GetPerim() return 4 * GetLength(); ; Square::Square(int len): Rectangle(len,len) Square::Square(int len, int width): Rectangle(len,width) if (GetLength()!= GetWidth()) cout << ʺError, not a square... a Rectangle??\nʺ; 15 Αφηρημένοι τύποι δεδομένων/5 int main() int choice; BOOL fquit = FALSE; Shape * sp; while (1) cout << ʺ(1)Circle (2)Rectangle (3)Square (0)Quit: ʺ; cin >> choice; switch (choice) case 1: sp = new Circle(5); break; case 2: sp = new Rectangle(4,6); break; case 3: sp = new Square(5); break; default: fquit = TRUE; break; if (fquit) break; sp >Draw(); cout << ʺ\nʺ; return 0; 16 8

Αφηρημένοι τύποι δεδομένων/ έξοδος (1)Circle (2)Rectangle (3)Square (0)Quit: 2 x x x x (1)Circle (2)Rectangle (3)Square (0)Quit:3 (1)Circle (2)Rectangle (3)Square (0)Quit:0 17 Pure Virtual συναρτήσεις Μια virtual συνάρτηση γίνεται pure virtual όταν αρχικοποιείται στο 0. virtual void Draw() = 0; Κάθε κλάση με μία ή περισσότερες Pure Virtual συναρτήσεις αποτελεί Αφηρημένη κλάση Δεν μπορούμε να δημιουργήσουμε αντικείμενο αφηρημένης κλάσης Είναι υποχρεωτικό να ορίσουμε τις Pure Virtual συναρτήσεις σε κάθε παραγόμενη κλάση 18 9

Pure Virtual συναρτήσεις class Shape Shape() ~Shape() virtual long GetArea() = 0; virtual long GetPerim()= 0; virtual void Draw() = 0; ; (1)Circle (2)Rectangle (3)Square (0)Quit: 2 x x x x (1)Circle (2)Rectangle (3)Square (0)Quit: 3 19 (1)Circle (2)Rectangle (3)Square (0)Quit: 0 Pure Virtual συναρτήσεις/1 #include <iostream.h> enum BOOL FALSE, TRUE ; class Shape Shape() ~Shape() virtual long GetArea() = 0; virtual long GetPerim()= 0; virtual void Draw() = 0; ; void Shape::Draw() cout << ʺAbstract drawing mechanism!\nʺ; 20 10

Pure Virtual συναρτήσεις/2 class Circle : public Shape Circle(int radius):itsradius(radius) it ) ~Circle() long GetArea() return 3 * itsradius * itsradius; long GetPerim() return 9 * itsradius; void Draw(); int itsradius; int itscircumference; ; void Circle::Draw() cout << ʺCircle drawing routine here!\nʺ; Shape::Draw(); 21 Pure Virtual συναρτήσεις/3 class Rectangle : public Shape Rectangle(int tlen, int width): itslength(len), itswidth(width) ~Rectangle() long GetArea() return itslength * itswidth; long GetPerim() return 2*itsLength + 2*itsWidth; virtual int GetLength() return itslength; virtual int GetWidth() return itswidth; void Draw(); int itswidth; int itslength; ; void Rectangle::Draw() for (int i = 0; i<itslength; i++) for (int j = 0; j<itswidth; j++) cout << ʺx ʺ; cout << ʺ\nʺ; Shape::Draw(); 22 11

Pure Virtual συναρτήσεις/4 class Square : public Rectangle Square(int tl len); Square(int len, int width); ~Square() long GetPerim() return 4 * GetLength(); ; Square::Square(int len): Rectangle(len,len) Square::Square(int len, int width): Rectangle(len,width) if (GetLength()!= GetWidth()) cout << ʺError, not a square... a Rectangle??\nʺ; 23 Pure Virtual συναρτήσεις/5 int main() int choice; BOOL fquit = FALSE; Shape * sp; while (1) cout << ʺ(1)Circle (2)Rectangle (3)Square (0)Quit: ʺ; cin >> choice; switch (choice) case 1: sp = new Circle(5); break; case 2: sp = new Rectangle(4,6); break; case 3: sp = new Square (5); break; default: fquit = TRUE; break; if (fquit) break; sp >Draw(); cout << ʺ\nʺ; return 0; 24 12

Pure Virtual συναρτήσεις/έξοδος (1)Circle (2)Rectangle (3)Square (0)Quit: 2 x x x x Abstract drawing mechanism! (1)Circle (2)Rectangle (3)Square (0)Quit: 3 Abstract drawing mechanism! (1)Circle (2)Rectangle (3)Square (0)Quit: 0 25 13