Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Tutorium Software-Engineering SS14 Florian Manghofer.

Ähnliche Präsentationen


Präsentation zum Thema: "Tutorium Software-Engineering SS14 Florian Manghofer."—  Präsentation transkript:

1 Tutorium Software-Engineering SS14 Florian Manghofer

2 Polymorphismus Polymorphismus (Vielgestaltigkeit) Abgeleitete Klasse erbt Methoden und Attribute der Elternklasse(n) Wenn jedoch eine Methode der Basisklasse nicht die gewünschte Funktionalität für die abgeleitete Klasse liefert, so kann diese überschrieben werden Eine überschriebene Methode ist im Sinne der Polymorphismus: eine Methode, die in einer Basisklasse definiert wurde mit derselben Signatur und demselben Rückgabewert in einer abgeleiteten Klasse definiert wurde Beispiel siehe Skript Seite.40/41 Wenn es erst während der Programmausführung entschieden wird welche Methode aufgerufen werden soll, so nennt man diesen Vorgang dynamisches oder spätes Binden.

3 Typenkonvertierung Virtuelle Methoden wird erst zur Laufzeit ausgewählt Implizite Typenkonvertierung Ein Objekt, ein Zeiger oder eine Referenz einer abgeleiteten Klasse kann einem Objekt, einem Zeiger oder einer Referenz seiner Basisklasse zugewiesen werden. Dabei findet eine implizite Typkonvertierung statt (gilt nicht umgekehrt). Bei Objekten gehen die zusätzlichen Daten der abgeleiteten Klasse verloren, der Basisklassenanteil wird kopiert.

4 Typenkonvertierung Implizite Typenkonvertierung Beispiel: class KFZ{ private: int ps; string name; public: KFZ(int pps,string nname):ps(pps),name(nname){}; void ausgabe(){ cout <<„PS:“ << this.ps << endl; cout << „Name: „ <<this.name << endl; } class Auto: public KFZ{ private: int anzahlPassagiere; public: Auto(int ps, string name, int aP){ KFZ(ps,name); this.anzahlPassagiere = aP; void ausgabe(){ cout << „Daten: “ <<this.ps << „ :“ << this.name << endl; cout << „Passagiere: „ << this.anzahlPassagiere << endl; }

5 Typenkonvertierung Implizite Typenkonvertierung Beispiel: int main(){ Auto *a1 = new Auto(120, „AUDI“,5); a1->ausgabe(); KFZ *k1 = a1; k1->ausgabe(); return 1; } Daten: 120 : AUDI Passagiere: 5 PS: 120 Name: AUDI a1 zeigt auf ein Objekt vom Typ Auto. Der Zeiger k1 vom Typ KFZ zeigt ebenfalls auf das Objekt vom Typ Auto. (über a1) Da der Zeiger k1 aber vom Typ KFZ ist, wird die Methode ausgabe() auch von KFZ aufgerufen, obwohl das Objekt eigentlich vom Typ Auto ist. (Umgekehrt funktioniert das nicht, weil die abgeleitete Klasse die Methoden der Elternklasse Enthält, aber die Elternklasse nicht die der Kindklasse.)

6 dynamisches Binden Wie im Beispiel gezeigt, bestimmt der Typ des Zeigers, welche Methode verwendet wird. Wir wollen aber einen allgemeinen Zeiger, der es uns ermöglicht, unterschiedliche Objekte zu verwalten, also z.B. KFZ und Auto und der dabei die richtige Methode, passend zum Objekttyp auswählen soll.  Der Objekttyp soll bestimmen, welche Methode gewählt wird, nicht der Typ des Zeigers!!!  Lösung durch virtuelle Methoden Dazu muss die entsprechende Methode/Methoden zumindest in der Basisklasse mit dem Schlüsselwort virtual gekennzeichnet werden. In diesem Beispiel betrifft dies die Methode ausgabe(): virtual void ausgabe(){…} Tipp: am besten auch in den Kindklassen mit virtual arbeiten. Erleichtert die Lesbarkeit!

7 dynamisches Binden Dynamisches Binden Beispiel: class KFZ{ private: int ps; string name; public: KFZ(int pps,string nname):ps(pps),name(nname){}; virtual void ausgabe(){ cout <<„PS:“ << this.ps << endl; cout << „Name: „ <<this.name << endl; } }; class Auto: public KFZ{ private: int anzahlPassagiere; public: Auto(int ps, string name, int aP):KFZ(ps,name),passagiere(p){}; virtual void ausgabe(){ cout << „Daten: “ <<this.ps << „ :“ << this.name << endl; cout << „Passagiere: „ << this.anzahlPassagiere << endl; } };

8 dynamisches Binden Dynamisches Binden Beispiel: int main(){ Auto *a1 = new Auto(120, „AUDI“,5); a1->ausgabe(); KFZ *k1 = a1; k1->ausgabe(); return 1; } Daten: 120 : AUDI Passagiere: 5 Jetzt bestimmt nichtmehr der Typ des Zeigers, welche Methode aufgerufen wird, sondern der Typ des Objektes. k1 ist zwar vom Typ KFZ, jedoch zeigt es auf ein Objekt vom Typ Auto. Da die Methode ausgabe() nun virtual ist, wird die Methode ausgabe() der Auto-Klasse aufgerufen, da das Objekt ja von diesem Typ ist. Diesen Vorgang nennt man dynmaisches Binden oder spätes Binden. Daten: 120 : AUDI Passagiere: 5

9 dynamisches Binden Allgemeiner Zeiger Hierarchie KFZ Beispiel: int main(){ KFZ *k1 = new Auto(120, „AUDI“,5); k1->ausgabe(); k1 = new LKW(„300“,“MAN“,“7t“,“80km/h“); k1->ausgabe(); k1 = new Zweirad(„15“,“BMW“,“130km/h“); k1->ausgabe(); return 1; } Angenommen, wir haben zusätzlich noch eine Klasse LKW und Zweirad, die jeweils von der Klasse KFZ erben. Diese besitzen ebenfalls die ausgabe() Methode als virtual. Nun wollen wir nur mit einem Zeiger diese verwalten. ausgabe() Methode von Auto ausgabe() Methode von LKW ausgabe() Methode von Zweirad

10 polymorphe Klassen Eine Klasse mit virtuellen Methoden wird polymorphe Klasse genannt. Ein derartiges dynamisches Verhalten bei Methoden funktioniert nur, wenn die entsprechenden Methoden, bei denen dies gewünscht ist, als virtual gekennzeichnet sind. virtual wirkt nur, wenn die so gekennzeichnete Methode in der abgeleiteten Klasse exakt die gleiche Schnittstelle (Methodenname + Rückgabetyp + Parameterliste) besitzt. Ausnahme: Ist der Rückgabetyp eine Referenz oder ein Zeiger auf die Basisklasse, dann darf der Rückgabetyp in der abgeleiteten Klasse eine Referenz oder ein Zeiger auf die abgeleitete Klasse sein.


Herunterladen ppt "Tutorium Software-Engineering SS14 Florian Manghofer."

Ähnliche Präsentationen


Google-Anzeigen