ΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Διδάσκων: Νίκος Παπασπύρου 1Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Διαφάνειες παρουσίασης #6 4 Μέθοδοι inline και const 4 Σχέση "είναι" και μετατροπές αντικειμένων 4 Επισκίαση μεθόδων και εικονικές μέθοδοι 4 Αφηρημένες μέθοδοι και κλάσεις 4 Πολυμορφισμός 4 Εικονικές κλάσεις
2Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Μέθοδοι inline class complex { //... public: double real () // inline { return re; } double imag (); // normal }; double complex::imag () { return im; }
3Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Μέθοδοι const class complex { //... public: double real () const; double set (double r, double i); }; complex c1; const complex c2; c1.set(1.0, 2.0); cout << c2.real(); c2.set(1.0, 2.0); // wrong!
4Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Σχέση "είναι", μετατροπές αντικειμένων class Base // etc. class Derived : public Base // etc. void f (Base b); void g (Base & b); void h (Base * p); Base b; f(b); g(b); h(&b); Derived d; f(d); g(d); h(&d);
5Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Επισκίαση μεθόδων(i) class Base { int a; void f (int x); void f (double x); int g (double x); }; class Derived : public Base { double a; int f (int x); void f (); }; Αντικείμενα της Base βλέπουν αυτά Αντικείμενα της Derived βλέπουν αυτά Επισκιάζονται
6Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Επισκίαση μεθόδων(ii) class Person { public: void sleep () { cout << "a person is sleeping\n"; } }; class Student : public Person { public: void sleep () { cout << "a student is sleeping\n"; } };
7Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Επισκίαση μεθόδων(iii) Person p; Student s; p.sleep(); s.sleep(); Person * pp; pp = &p; pp->sleep(); pp = &s; pp->sleep(); Person sleep p Student Person sleep s pp
8Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Εικονικές μέθοδοι(i) class Person { public: virtual void sleep (); }; class Student : public Person { public: virtual void sleep (); }; void Person::sleep () { cout << "a person is sleeping\n"; } void Student::sleep () { cout << "a student is sleeping\n"; } Person sleep Student Person sleep
9Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Εικονικές μέθοδοι(ii) class Person { public: virtual ~Person (); }; class Student : public Person { public: virtual ~Student (); }; Person::~Person () { cout << "destroying a person\n"; } Student::~Student () { cout << "destroying a student\n"; }
10Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Εικονικές μέθοδοι(iii) Person * pp; pp = new Person; delete pp; pp = new Student; delete pp;
11Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Αφηρημένες μέθοδοι και κλάσεις class Person { public: virtual void sleep () = 0; }; class Student : public Person { public: virtual void sleep (); }; void Student::sleep () { cout << "a student is sleeping\n"; } Αφηρημένη μέθοδος (abstract method) u Αφηρημένες κλάσεις (abstract classes): κλάσεις που περιέχουν αφηρημένες μεθόδους
12Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Πολυμορφισμός(i) u Η ίδια μέθοδος υλοποιείται διαφορετικά σε διαφορετικές εξειδικεύσεις των αντικειμένων u Υλοποιείται με χρήση: l εικονικών μεθόδων l δεικτών ή αναφορών
13Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Πολυμορφισμός(ii) class Person { public: virtual void freeTime (); }; class Student : public Person { public: virtual void freeTime (); }; class Child : public Person { public: virtual void freeTime (); };
14Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Πολυμορφισμός(iii) void Person::freeTime () { cout << "a person is sleeping\n"; } void Student::freeTime () { cout << "a student is reading\n"; } void Child::freeTime () { cout << "a child is playing\n"; }
15Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Πολυμορφισμός(iv) void allFree (int n, Person * p[]) { for (int i=0; i<n; i++) p[i]->freeTime(); } int main () { Person * p[] = { new Person, new Student, new Child }; allFree(3, p); return 0; }
16Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ WorkingStudent Εικονικές κλάσεις(i) class Person // etc. class Student : public Person // etc. class Employee : public Person // etc. class WorkingStudent : public Student public Employee, // etc. Employee Person Student Person
17Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Εικονικές κλάσεις(ii) class Person // etc. class Student : virtual public Person // etc. class Employee : virtual public Person // etc. class WorkingStudent : public Student public Employee, // etc. Employee Person Student Person WorkingStudent Person