9. Vererbung und Polymorphismus

Größe: px
Ab Seite anzeigen:

Download "9. Vererbung und Polymorphismus"

Transkript

1 C und C++ (CPP) 9. Vererbung und Polymorphismus Prof. Dr. Marc Rennhard Institut für angewandte Informationstechnologie InIT ZHAW Zürcher Hochschule für angewandte Wissenschaften Marc Rennhard, , CPP_Vererbung.ppt 1 1

2 Ablauf Grundlegende Eigenschaften der Vererbung in C++ Eine einfache Klassenhierarchie in Java und C++ Method Overriding Polymorphismus Dynamic und Static Casts Method Overloading in Subklassen und Namensauflösung Virtual Destructors Operator Overloading und Vererbung Mehrfachvererbung Marc Rennhard, , CPP_Vererbung.ppt 2 2

3 Ziele Sie wissen, was Vererbung prinzipiell ist und wie Vererbung in C++ konkret funktioniert Sie wissen, was Method Overriding bedeutet Sie verstehen wie Polymorphismus in C++ funktioniert und welchen Einfluss dabei virtuelle Methoden haben Sie verstehen das Konzept von Dynamischen und Statischen Casts und können diese Casts selbst anwenden Sie verstehen die grundlegende Idee von Mehrfachvererbung, die potentiellen Probleme, die dabei auftauchen, und wie man mit diesen Problemen umgeht Marc Rennhard, , CPP_Vererbung.ppt 3 3

4 Einführung (1) Wie in Java: In C++ können Klassen erweitert/abgeleitet werden Vererbung Superklasse: Klasse, von welcher vererbt wird Superklasse Subklasse: die abgeleitete Klasse Von einer Subklasse können wiederum Subklasse Subklassen abgeleitet werden Begriffe Superklasse und Subklasse sind relativ Keine Interfaces in C++ Mehrfachvererbung in C++: eine Klasse kann von mehr als einer Klasse abgeleitet werden Eine Subklasse erbt alle public und protected (nicht aber private) Methoden und Variablen aller ihrer Superklassen (auch der indirekten Superklassen) Subklassen können eine Methode einer Superklasse überschreiben und damit die Methode der Superklasse in der Subklasse überdecken Method Overriding Gilt auch für Instanzvariablen und statische Variablen Attribute Overriding Marc Rennhard, , CPP_Vererbung.ppt 4 Die prinzipielle Idee hinter Vererbung kennen Sie bereits aus den Vorlesungen über Java, ist für alle OO-Sprachen dieselbe und wird hier nicht detailliert wiederholt. Nur zur Erinnerung: Die Idee, die hinter dem Prinzip der Vererbung steht, besagt, dass es sinnvoller und vor allem rationeller ist, vorhandene und getestete Teile alter Programme für neue Programme zu verwenden, statt jedes Mal alles neu zu schreiben. Dabei muss es möglich sein, die schon bestehenden Programmteile den neuen Aufgaben anzupassen und zwar ohne den eigentlichen Programmcode abzuändern, der vielleicht gar nicht zur Verfügung steht. Das Prinzip gilt auch nicht nur, um Code eines anderen Programms wieder zu verwenden, sondern auch innerhalb eines Programms, wo einzelne spezialisierte Programmteile häufig von anderen, grundlegenderen Programmteilen abhängen und deshalb der Gebrauch von Vererbung sinnvoll ist. Dabei wird der grundlegende Teil des Programms in einer Klasse implementiert und verschiedene spezialisierte Teile in weiteren Klassen implementiert werden, die alle von der Grundklasse abgeleitet werden. Dabei kann eine Subklasse wiederum selbst Subklassen haben, wodurch eigentliche Klassenhierarchien entstehen. Grösserer OO-Programme bestehen eigentlich immer aus einer grossen Anzahl von Klassen, wobei viele dieser Klassen von anderen Klassen im Programm abgeleitet sind. 4

5 Einführung (2) C++ unterstützt wie Java Polymorphismus: eine Variable vom Typ einer Superklasse kann irgendein Objekt vom Typ einer Subklasse beinhalten Generell gilt: Vererbung und Polymorphismus werden flexibler gehandhabt als in Java, sind aber auch anfälliger für Programmierfehler Beispiel: in Java ist eine Objektvariable immer polymorph, in C++ wird dies vom Programmierer kontrolliert Marc Rennhard, , CPP_Vererbung.ppt 5 5

6 Vererbung (1) Ableiten einer Klasse mit Doppelpunkt : und Visibility Modifier: Java: class B extends A {... C++: class B : public A {... Alle public und protected Methoden und Variablen werden vererbt und sind dadurch auch in der Subklasse vorhanden Diese Sichtbarkeit kann mit dem Visibility-Modifier nach dem Doppelpunkt weiter eingeschränkt werden: Variable/Methode in Superklasse public protected private Subklasse vererbt als public protected private (Def.) Variable/Methode in Subklasse public protected private protected protected private nicht vererbt nicht vererbt nicht vererbt Marc Rennhard, , CPP_Vererbung.ppt 6 Man beachte, dass der Default Visibility Modifier private ist und nicht public auch wenn man in den allermeisten Fällen public benötigt. Java kennt diese weitere Einschränkung mittels Visibility Modifier bei der Vererbung nicht es wird immer public vererbt. Weil prinzipiell von jeder entwickelten Klasse Subklassen abgeleitet werden können, sollten Sie bei der Entwicklung Variablen und Methoden wenn möglich protected statt private spezifizieren - ausser die entsprechende Variable/Methode soll wirklich nicht in einer Subklasse verfügbar sein. 6

7 Vererbung (2) Beispiel zu private / protected / public Vererbung: class A { private: int priv; protected: int prot; int publ; class B : pxxx A { void m() {... void f() { A a; B b; Zugriff von aussen (f()) a.priv++; a.prot++; a.publ++; b.priv++; b.prot++; pxxx = private nein nein ja nein nein pxxx = protected nein nein ja nein nein pxxx = public nein nein ja nein nein Zugriff innerhalb B (m()) priv++; prot++; publ++; unabhängig von pxxx nein ja ja b.publ++; nein nein ja Marc Rennhard, , CPP_Vererbung.ppt 7 7

8 Vererbung (3) private / protected Vererbung: alle public Methoden der Superklasse sind in der Subklasse nicht mehr public oft eine zu starke Einschränkung Abhilfe: explizite Wiederimplementierung einiger Methoden in der Subklasse, wobei diese Methoden explizit die Methoden der Superklasse aufrufen class A { void func1() { void func2() { class B : protected A { void func2() {A::func2(); int main() { B b; b.func1(); // Kompilierfehler, protected b.func2(); // Ok, public Der Scope Resolution Operator :: wird allgemein dann gebraucht, wenn expizit auf eine Klasse zugegriffen werden soll private/protected Vererbung wird selten verwendet evtl. ein Hinweis auf unsauberes OO- Design! Marc Rennhard, , CPP_Vererbung.ppt 8 Generell wird private/protected Vererbung in der Praxis selten verwendet; dementsprechend wurde es in Java auch weggelassen. Auch vom OO-Standpunkt her gesehen ist private/protected Vererbung nicht sauber, weil dann die Subklasse die (nicht privaten) Methoden der Superklasse nicht einfach unverändert erbt (wie es bei sauberem OO-Design sein soll), sondern deren Sichtbarkeit verändert. Wenn Sie also einmal zu private/protected Vererbung greifen sollten, dann sollten Sie sich fragen, ob die Subklasse wirklich von dieser Superklasse abgeleitet werden soll, oder ob nicht in Ihrem Klassendiagramm ein Schönheitsfehler drin steckt. Mit sauberem OO- Design sollten Sie private/protected Vererbung eigentlich nicht verwenden müssen. Ein weiteres Problem mit nicht-public Vererbung ist, dass es mit Polymorphismus nicht kompatibel ist. So funktionieren bei Verwendung der obigen Klassen die folgenden Zuweisungen nicht, da B von der Klasse A mit Visibility protected abgeleitet wird: A a1, *a2; B b; a1 = b; // Kompilierfehler a2 = &b; // Kompilierfehler 8

9 Vererbung (4) Constructors werden nicht vererbt, es existiert Constructor Chaining (wie Java) Ist B eine Subklasse von A, dann passiert bei der Initialisierung einer Instanz der Klasse B folgendes: Zuerst wird der Default Constructor der Klasse A aufgerufen Dann wird der (der Initialisierung) entsprechende Constructor der Klasse B aufgerufen Um einen anderen als den Default Constructor der Klasse A aufzurufen muss dies im Constructor der Klasse B mit einem Initializer explizit angegeben werden (Java: super(...)) Existiert der Default oder explizit angegebene Constructor in der Klasse A nicht, gibt es einen Fehler beim Kompilieren Destructors werden ebenfalls nicht vererbt Destructors werden in umgekehrter Reihenfolge zu den Constructors aufgerufen (zuerst der Destructor von Klasse B, dann der von Klasse A) Marc Rennhard, , CPP_Vererbung.ppt 9 Bei mehrstufiger Vererbung werden zuerst die Default Constructor aller Superklassen aufgerufen, und zwar von oben nach unten. Ist also C eine Subklasse von B und B eine Subklasse von A, so wird erst der Default Constructor von A, dann der von B und dann der der Initialisierung entsprechende Constructor von C ausgeführt. Die Reihenfolge bei Constructor Chaining macht Sinn, denn dadurch werden die durch Vererbung voneinander abhängigen Objekte in der richtigen Reihenfolge initialisiert. Aus dem gleichen Grund macht die umgekehrte Reihenfolge bei den Destructors Sinn. 9

10 Vererbung (5) Beispiel zu Constructor Chaining: #include <iostream> // constructor1.cpp using namespace std; class A { A() {cout << "Constructor A()" << endl; A(int v) {cout << "Constructor A(" << v << ")" << endl; class B : public A { B() {cout << "Constructor B()" << endl; B(int v) {cout << "Constructor B(" << v << ")" << endl; int main() { A a; // Ausgabe: Constructor A() B b; // Ausgabe: Constructor A() Constructor B() A c(3); // Ausgabe: Constructor A(3) B d(5); // Ausgabe: Constructor A() Constructor B(5) Marc Rennhard, , CPP_Vererbung.ppt 10 10

11 Vererbung (6) Beispiel zu Constructor Chaining mit Initializer: #include <iostream> // constructor2.cpp using namespace std; class A { A() {cout << "Constructor A()" << endl; A(int v) {cout << "Constructor A(" << v << ")" << endl; class B : public A { B() {cout << "Constructor B()" << endl; B(int v) : A(v) {cout << "Constructor B(" << v << ")" << endl; int main() { A a; // Ausgabe: Constructor A() B b; // Ausgabe: Constructor A() Constructor B() A c(3); // Ausgabe: Constructor A(3) B d(5); // Ausgabe: Constructor A(5) Constructor B(5) Marc Rennhard, , CPP_Vererbung.ppt 11 11

12 Eine einfache Klassenhierarchie Um Vererbung und Polymorphismus im Detail zu besprechen, verwenden wir die folgende Klassenhierarchie: Auto Japanisches Auto Italienisches Auto Deutsches Auto Mazda Nissan Ferrari Fiat BMW Opel VW Wir beschränken uns auf die gelben Klassen Marc Rennhard, , CPP_Vererbung.ppt 12 12

13 Implementierung in Java // AutoProg.java abstract class Auto { abstract public void marke(); class ItalienischesAuto extends Auto { public void marke() {System.out.println("Macchina Italiana"); public void fahre250() {System.out.println("geht nicht"); class Fiat extends ItalienischesAuto { public void marke() {System.out.println("Fiat"); class Ferrari extends ItalienischesAuto { public void marke() {System.out.println("Ferrari"); public void fahre250() {System.out.println("250!"); Marc Rennhard, , CPP_Vererbung.ppt 13 13

14 Implementierung in C++ // autoprog.cpp class Auto { virtual void marke() = 0; class ItalienischesAuto : public Auto { virtual void marke() {cout << "Macchina Italiana" << endl; void fahre250() {cout << "geht nicht" << endl; class Fiat : public ItalienischesAuto { virtual void marke() {cout << "Fiat" << endl; class Ferrari : public ItalienischesAuto { virtual void marke() {cout << "Ferrari" << endl; void fahre250() {cout << "250!" << endl; Marc Rennhard, , CPP_Vererbung.ppt 14 14

15 Method Overriding (1) Method Overriding: Eine Subklasse implementiert eine Methode einer Superklasse neu (identischer Methodenkopf ist notwendig) Auto-Beispiel: class Auto { virtual void marke() = 0; class ItalienischesAuto : public Auto { virtual void marke() {cout << "Macchina Italiana" << endl; void fahre250() {cout << "geht nicht" << endl; class Fiat : public ItalienischesAuto { virtual void marke() {cout << "Fiat" << endl; class Ferrari : public ItalienischesAuto { virtual void marke() {cout << "Ferrari" << endl; void fahre250() {cout << "250!" << endl; Marc Rennhard, , CPP_Vererbung.ppt 15 Identischer Methodenkopf heisst, dass sowohl Sichtbarkeit, Rückgabewert, Methodenname und die Datentypen der Methodenparameter gleich sein müssen. Beim Auto-Beispiel wird die Methode marke von Auto in ItalienischesAuto überschrieben, welche dann wiederum in den Klassen Fiat und Ferrari überschrieben werden. fahre250 ist zum ersten mal in Italienisches Auto definiert und wird in der Klasse Ferrari überschrieben, nicht aber in der Klasse Fiat. 15

16 Method Overriding (2) Wird eine Methode überschrieben, ist die Methode der Superklasse in einer Instanz der Subklasse nicht mehr sichtbar und es wird die neue Version der Methode verwendet: Ferrari f = new Ferrari(); // Java ItalienischesAuto ia = new ItalienischesAuto(); ia.marke(); // Macchina Italiana ia.fahre250(); // geht nicht f.marke(); // Ferrari f.fahre250(); // 250! Ferrari f; // C++ ItalienischesAuto ia; ia.marke(); // Macchina Italiana ia.fahre250(); // geht nicht f.marke(); // Ferrari f.fahre250(); // 250! Marc Rennhard, , CPP_Vererbung.ppt 16 Wenn in der Subklasse auf eine überschriebene Methode/Variable der Superklasse zugegriffen werden soll, kann man in C++ den Scope resolution Operator :: verwenden. Aus der Klasse Ferrari kann damit auf die marke() Methode von ItalienischesAuto zugegriffen werden: ItalienischesAuto::marke(). Die entspricht in etwa der Funktionalität, die Sie mit dem Keyword super in Java erreichen können. 16

17 Polymorphismus (1) Eines der wichtigsten Konzepte der objektorientierten Programmierung Polymorphismus: eine Variable vom Typ einer Superklasse kann irgendein Objekt vom Typ einer Subklasse beinhalten (geht umgekehrt nicht!) Anders gesagt: der statische Typ (der bei der Deklaration angegebene Typ) einer Variablen kann sich von dem dynamischen Typ (der Typ des Werts, den die Variable gerade enthält) unterscheiden Auto-Beispiel: Eine Variable vom Typ ItalienischesAuto (statischer Typ)......kann eine Variable vom Typ Ferrari (dynamischer Typ) enthalten Der Zusammenhang zwischen Polymorphismus und Method Overriding ist ein wichtiger Aspekt von objektorientierten Programmiersprache In Java wird immer die Methode des dynamischen Typs angewendet In C++ wird das Verhalten durch den Programmierer bestimmt Marc Rennhard, , CPP_Vererbung.ppt 17 Der statische Typ einer Variable ist der, mit welchem sie deklariert wurde. Ferrari f; der statische Typ von f ist Ferrari. 17

18 Polymorphismus (2) Polymorphismus in Java: Ferrari f = new Ferrari(); f.marke(); // Ferrari f.fahre250(); // 250! ItalienischesAuto ia = f; ia.marke(); // Ferrari ia.fahre250(); // 250! Java: Obwohl der statische Typ von ia ItalienischesAuto ist, werden die Methoden des dynamischen Typs (Ferrari) verwendet! In Java ist das immer so und kann auch nicht vom Programmierer beeinflusst werden Marc Rennhard, , CPP_Vererbung.ppt 18 Natürlich muss der statische Typ (hier Italienisches Auto) die aufgerufene Methode selbst zur Verfügung stellen, entweder indem er sie selbst implementiert (wie bei fahre250()) oder indem er sie erbt. Falls dies nicht der Fall ist und ItalienischesAuto zb die Methode fahre250() nicht implementieren, so würde die letzte Zeile im Programm oben zu einem Kompilierfehler führen. 18

19 Polymorphismus (3) Polymorphismus in C++ mit Zuweisung von Objekten: Ferrari f; f.marke(); // Ferrari f.fahre250(); // 250! ItalienischesAuto ia; ia = f; ia.marke(); // Macchina Italiana ia.fahre250(); // geht nicht Werden Objekte einender zugewiesen, so werden immer die Methoden des statischen Typs (ItalienischesAuto) verwendet in diesem Fall existiert gar kein Polymorphismus Bei der Zuweisung werden keine Pointer kopiert, sondern immer die Objekte selbst Weil ein Objekt vom Typ Ferrari in einem Objekt vom Typ ItalienischesAuto keinen Platz hat, fallen die Erweiterungen der Klasse Ferrari weg Dadurch wird das Objekt in ein ItalienischesAuto konvertiert und verhält sich auch genau so Marc Rennhard, , CPP_Vererbung.ppt 19 Erklärung: Für die Variablen f und ia auf dem Stack wird der Speicherplatz bereits zur Kompilierzeit bestimmt Bei der Zuweisung ia = f muss also die grössere Variable f (Ferrari ist ja eine Erweiterung von ItalienischesAuto) im Speicherplatz der kleineren Variablen ia abgespeichert werden Dabei wird im Wesentlichen diese Erweiterung einfach abgeschnitten (slicing), womit die neue Information von f (zum Beispiel die überschriebenen Methoden) gar nicht verwendet werden können 19

20 Polymorphismus (4) Polymorphismus in C++ mit Zuweisung von Pointern: Ferrari f; f.marke(); // Ferrari f.fahre250(); // 250! ItalienischesAuto *ia = &f; ia->marke(); // Ferrari ia->fahre250(); // geht nicht Werden statt Objekte Pointer zugewiesen, so wird......die Methode des dynamischen Typs (Ferrari) verwendet, wenn die entsprechende Methode als virtual definiert wurde Andernfalls wird die Methode des statischen Typs (ItalienischesAuto) verwendet Polymorphismus in C++ entspricht also Polymorphismus in Java, wenn: Mit Pointern gearbeitet wird Und wenn alle Methoden (die overridden werden) als virtual definiert werden Marc Rennhard, , CPP_Vererbung.ppt 20 Erklärung: Bei der Zuweisung ia = &f werden nur Pointer kopiert, ia zeigt also auf den Anfang von f; und damit auf das gesamte Ferrari-Objekt. Dadurch ist Polymorphismus prinzipiell möglich. Werden Spezifikation und Implementierung der Klasse getrennt (was man ja eigentlich immer machen sollte), so wird das Keyword virtual nur bei der Spezifikation der Klasse, nicht aber bei der Implementierung angegeben. 20

21 Polymorphismus (5) Polymorphismus funktioniert natürlich auch auf dem Heap, wo automatisch mit Pointern gearbeitet wird: Ferrari *f = new Ferrari(); f->marke(); // Ferrari f->fahre250(); // 250! ItalienischesAuto *ia = f; ia->marke(); // Ferrari ia->fahre250(); // geht nicht Weil Referenzen intern nichts anderes als Pointer sind, funktioniert Polymorphismus auch mit Referenzen: Ferrari f; f.marke(); // Ferrari f.fahre250(); // 250! ItalienischesAuto &ia = f; ia.marke(); // Ferrari ia.fahre250(); // geht nicht Marc Rennhard, , CPP_Vererbung.ppt 21 Auch hier wird in beiden Fällen bei der Zuweisung ia = f nur ein Pointer kopiert. Obwohl Polymorphismus mit Referenzen funktioniert, sind Referenzen nicht geeignet, um wirklich generell mit Polymorphismus zu arbeiten. Das Problem liegt daran, dass eine Referenz gleich bei der Deklaration ein Objekt erhalten muss, welches es referenziert und dann immer nur das Objekt referenzieren kann, mit welchem es initialisiert wurde. Im Beispiel oben kann also ia nie ein anderes Objekt als f referenzieren wie zb ein Objekt vom Typ Fiat oder vom Typ einer Subklasse von Ferrari. Auch gibt es in C++ keine Arrays of References. Pointer haben diese Einschränkungen nicht, sind dadurch flexibler und mächtiger und drängen sich deshalb bei der Arbeit mit Polymorphismus meist auf. Im Allgemeinen sind Referenzen sehr praktisch bei der Parameterübergabe an Funktionen und methoden, weil die Schreibweise dadurch im Vergleich zu Pointern einfacher wird. Dabei funktioniert Polymorphismus natürlich auch: ist der Parameter vom Typ einer Referenz auf ItalienischesAuto und wird beim Aufruf ein Ferrari übergeben, dann wird sich innerhalb der Funktion/Methode die Referenz genauso verhalten wie ia im unteren Beispiel auf der obigen Folie. 21

22 Polymorphismus (6) Bei Polymorphismus spricht man auch oft von early binding und late binding Early binding: bereits während des Kompilierens weiss man, welche Methode ausgeführt werden wird (statischer Typ): ia.marke(); Late binding: erst zur Laufzeit kennt man den dynamischen Typ und dadurch die entsprechende Methode: ia->marke(); Eine Methode, die in einer Superklasse nicht virtual ist, kann in Subklassen nicht virtual gemacht werden Ebenso bleibt eine virtual Methode immer virtual, auch wenn in Subklassen das virtual Keyword nicht angegeben wird (in diesem Fall ist das Keyword virtual also optional) Wie in Java gibt es in C++ abstrakte Klassen (Auto in unserer Hierarchie) Können nicht instanziert werden Enthalten eine (oder mehrere) pure virtual Methoden (virtual, kein Body, dafür =0 am Ende) Marc Rennhard, , CPP_Vererbung.ppt 22 Zu early/late binding: Im ersten Fall sieht der Compiler, dass ia eine Objektvariable vom Typ ItalienischesAuto ist (kein Pointer, keine Referenz) und weiss damit, dass auf jeden Fall die Methode marke() von ItalienischesAuto aufgerufen wird. Der Methodenaufruf kann also fix in das ausführbare Programm eingefügt werden. Im zweiten Fall ist ia ein Pointer auf ein ItalienischesAuto (Referenz wäre identisch). Weil dieser Pointer aber auch auf einen Ferrari oder einen Fiat zeigen kann und die Methode marke() zudem virtual ist, kann erst zur Laufzeit anhand des dynamischen Typs entschieden werden, welche Methode zum Zug kommt. Der Aufwand für diese zusätzliche Entscheidung ist der Preis von Polymorphismus und resultiert während der Programmausführung in einem kleinen Performanceverlust. 22

23 Method Overriding Revisited (3) Erweitern wir ItalienischesAuto um eine Methode markefahre250: class ItalienischesAuto : public Auto { virtual void marke() {cout << "Macchina Italiana" << endl; void fahre250() {cout << "geht nicht" << endl; void markefahre250() {marke(); fahre250(); Testprogramm: Ferrari f; f.marke(); // Ferrari f.fahre250(); // 250! f.markefahre250(); // Ferrari geht nicht Wir beobachten also folgendes: Direkter Aufruf von marke und fahre250: Methoden von Ferrari werden ausgeführt Indirekter Aufruf (via markefahre250): Bei marke wird die Methode der Klasse Ferrari ausgeführt Bei fahre250 wird die Methode von ItalienischesAuto ausgeführt Marc Rennhard, , CPP_Vererbung.ppt 23 Das folgende Programm verhält sich ebenfalls gleich wie das obige: Ferrari f; ItalienischesAuto *ia = &f; ia->markefahre250(); Dies bedeutet, dass via markefahre250() die virtual Methoden des dynamischen Typs (f) und nicht des statischen Typs (ia) ausgeführt werden. 23

24 Method Overriding Revisited (4) Erklärung: das liegt wiederum daran, ob die Methoden virtual sind oder nicht: markefahre250 ist eine Methode von ItalienischesAuto markefahre250 ruft deshalb grundsätzlich ebenfalls die Methoden marke und fahre250 von ItalienischesAuto auf fahre250 ist nicht virtual es wird immer die Methode von ItalienischesAuto aufgerufen, egal ob markefahre250 für eine Variable vom Typ ItalienischesAuto oder einer Subklasse (Ferrari) ausgeführt wird marke ist virtual es wird die Methode des Typs der Variablen (Ferrari) ausgeführt Auch hier verhält sich Java wie C++ wenn in C++ alle Methoden virtual sind Marc Rennhard, , CPP_Vererbung.ppt 24 24

25 Übung 1 zu Vererbung und Polymorphismus #include <iostream> // monster.cpp using namespace std; class Monster { protected: virtual void augen() {cout << ":"; virtual void nase () {cout << '-'; virtual void mund () {cout << ' '; void zeige() { augen(); nase(); mund(); cout << endl; class Beisser : public Monster { virtual void mund() {cout << 'X'; virtual void beiss() { cout << "beiss, beiss" << endl; class Vampir : public Beisser { virtual void augen() {cout << "8"; virtual void mund() {cout << '#'; int main() { Monster m; m.zeige(); Beisser b; b.zeige(); Vampir v; v.zeige(); m = v; m.zeige(); b = m; b.zeige(); Monster* pm = new Monster; Vampir* pv = new Vampir; pm->zeige(); pm->beiss(); pv->zeige(); pv->beiss(); pm = pv; pm->zeige(); pm->beiss(); Was wird von diesem Programm ausgegeben? Zusatzfrage: Was verändert sich, wenn mund nicht virtual ist? Marc Rennhard, , CPP_Vererbung.ppt 25 25

26 Downcasting Downcasting (auch Reverse Polymorphism genannt) bedeutet die Konvertierung einer polymorphen Variablen in ihren dynamischen Typ In Java gibt es einen Check zur Laufzeit, ob ein Objekt wirklich korrekt konvertiert wird: ItalienischesAuto ia = new Fiat(); Fiat ft = (Fiat) ia; // Korrekt Ferrari fe = (Ferrari) ia; // Generiert eine ClassCastException In C++ gibt es keinen solchen Check: ItalienischesAuto *ia = new Fiat(); Fiat *ft = (Fiat*) ia; // Korrekt Ferrari *fe = (Ferrari*) ia; // Verhalten nicht definiert In Java kann man mit instanceof den dynamischen Typ herausfinden: ItalienischesAuto ia = new Fiat(); if (ia instanceof Fiat) { Fiat ft = (Fiat) ia;... Marc Rennhard, , CPP_Vererbung.ppt 26 Der Name Reverse Polymorphism kommt daher, weil die Zuweisung zu einer polymorphen Variable rückgängig gemacht wird, indem man den dynamischen Typ erhalten möchte. Downcasting kommt von daher, dass man den Datentyp in der Klassenhierarchie nach unten casted. Sowohl in Java als auch in C++ muss dabei der Typ, in welchen konvertiert wird, explizit angegeben werden. 26

27 Dynamic Cast C++: kein instanceof, dafür ein spezieller Konvertierungstyp, der Dynamic Cast Gehört zum Runtime Type Information (RTTI) System und ist als Template Function implementiert Der Dynamic Cast prüft die Gültigkeit der Konvertierung und gibt im Fehlerfall NULL zurück: ItalienischesAuto *ia = new Fiat(); Fiat *ft = dynamic_cast<fiat*>(ia); if (ft) {... // Cast gültig else {... // Cast nicht gültig (ft == NULL (= 0)) Ein Dynamic Cast funktioniert nur, wenn die entsprechende Variable polymorph ist, das heisst: Wenn ein Pointer auf das Objekt verwendet wird Wenn die Klasse mindestens eine virtuelle Methode enthält Marc Rennhard, , CPP_Vererbung.ppt 27 Template Functions werden im nächsten Kapitel behandelt. Zusatzinfo für extrem Interessierte: Nur wenn mindestens eine virtual Methode definiert wird, wird für das Objekt eine sogenannte Runtime Type Information generiert. Dies ist nötig, damit Polymorphismus für das Objekt überhaupt funktioniert, denn dadurch kann der Typ eines Objekts zur Laufzeit rausgefunden werden und dadurch virtual Methoden in Abhängigkeit vom dynamischen Typ der Variablen richtig aufgelöst werden. Der dynamic cast verwendet genau diese Runtime Type Information, um den dynamischen Typ zu bestimmen und existiert diese Information nicht, dann funktioniert dies eben nicht. Durch die Konsultation der Runtype Time Information ist der Dynamic Cast performancemässig eine relativ teure Operation und sollte deshalb nur dann durchgeführt werden, wenn man zur Laufzeit den dynamischen Typ der polymorphen Variablen nicht kennt. Falls man diesen eindeutig kennt, so genügt ein normaler Cast oder ein Static Cast (siehe nächste Folie). 27

28 Static Cast Es gibt auch einen Static Cast; hat ähnliche Syntax wie Dynamic Cast; hat sonst aber wenig damit zu tun Sehr ähnlich wie ein normaler Cast wie zb (Ferrari*) oder (int) Der Static Cast prüft jedoch den statischen Typ eine potentiell unsinnige Konvertierung von int* zu int wird verhindert Ist damit etwas sicherer als der normale Cast Beispiel für normale Casts und Static Casts: void* v =...; // Wir wissen von irgendwoher, dass v auf einen Ferrari zeigt Ferrari *fe1 = (Ferrari*) (v); // Normaler Cast Ferrari *fe2 = static_cast<ferrari*>(v); // Static Cast int *pi = new int; *pi = 12; int b = (int) pi; // Normaler Cast int* int: OK int c = static_cast<int>(pi); // Static Cast int* int: // Kompilierfehler double d = 3.14; int e = static_cast<int>(d); // Static Cast double int OK Marc Rennhard, , CPP_Vererbung.ppt 28 Der Static Cast steht gleich hier nach dem Dynamic Cast weil der Gebrauch sehr ähnlich ist; die beiden Casts haben aber sonst wenig miteinander zu tun: Der Dynamic Cast dient dazu, eine sichere Konvertierung einer polymorphen Variable in ihren dynamischen Typ durchzuführen. Der Static Cast ist einfach eine etwas restriktivere (und damit potentiell sicherere) Variante als der normale Cast, da er unsinnige Casts vermeidet und jeweils einen Kompilierfehler generiert. Mit Polymorphismus hat der Static Cast aber nichts zu tun. 28

29 Method Overloading in Subklassen (1) Java & C++: Eine Methode einer Superklasse kann in einer Subklasse überladen werden Java: Eine Instanz der Subklasse kann die Methoden der Superklasse und die überladenen Methoden in der Subklasse einfach verwenden: // Overloading.java class Parent { public void test() {System.out.println("test()"); class Child extends Parent { public void test(int i) {System.out.println("test(int)"); public class Overloading { public static void main(string[] args) { Child c = new Child(); c.test(1); // Gibt test(int) aus c.test(); // Gibt test() aus Marc Rennhard, , CPP_Vererbung.ppt 29 29

30 Method Overloading in Subklassen (2) Das gleiche Beispiel in C++: // overloading.cpp class Parent { void test () {cout << "test()" << endl; class Child : public Parent { void test(int i) {cout << "test(int)" << endl; int main() { Child c; c.test(1); c.test(); Beim Kompilieren mit g++ resultiert folgender Output: overloading.cpp: In function 'int main()': overloading.cpp:17: error: no matching function for call to 'Child::test()' overloading.cpp:11: error: candidates are: void Child::test(int) Marc Rennhard, , CPP_Vererbung.ppt 30 30

31 Method Overloading in Subklassen (3) Grund für den Kompilierfehler: C++ bei der Namensauflösung (welche Methode gehört zu welchem Methodenaufruf) wie folgt vor: 1. Suche die erste Klasse (beginnend mit der eigenen Klasse), in welcher der Name der aufgerufenen Methode auftritt test wird in der Klasse Child gefunden 2. Suche die Methode innerhalb dieser Klasse Child kennt test(int), nicht aber test() Kompilierfehler Abhilfe: Jede in Subklassen überladene Methode sollte dort neu definiert werden (am einfachsten mit einer inline Methode) class Child : public Parent { void test() {Parent::test(); void test(int i) {cout << "test(int)" << endl; Marc Rennhard, , CPP_Vererbung.ppt 31 Man kann sich jetzt fragen, wieso es in Java keinen Fehler gab. Dies hat mit der Namensauflösung in Java zu tun: Es gibt nur einen Schritt, bei welchem die komplette Signatur der Methode zur Suche verwendet wird und nicht nur deren Namen. Damit wird die richtige Klasse immer gefunden wenn die Methode wirklich existiert. 31

32 Virtual Destructors (1) Im Zusammenhang mit Polymorphismus stellt sich die Frage, ob ein Destructor virtual deklariert werden soll Erweiterung unserer Hierarchie mit Destructors: class Auto { virtual ~Auto() {cout << "Bye bye Auto" << endl;... public class ItalienischesAuto extends Auto { ~ItalienischesAuto() {cout << "Addio Italienisches Auto" << endl;... class Ferrari : public ItalienischesAuto { ~Ferrari() {cout << "Ciao Ferrari" << endl; Marc Rennhard, , CPP_Vererbung.ppt 32 Wie bei Method Overriding im Zusammenhanh mit normalen Methoden ist es auch hier entscheidend, ob an oberster Stelle der Destructor virtual definiert ist. Ebenfalls kann das virtual Keyword in den Destructors der Subklassen weggelassen werden. 32

33 Virtual Destructors (2) Testprogramm: Auto *a = new Ferrari(); delete a; // Ausgabe: Ciao Ferrari Addio Italienisches Auto Bye bye Auto ItalienischesAuto *ia = new Ferrari(); delete ia; // Ausgabe: Ciao Ferrari Addio Italienisches Auto Bye bye Auto Also gilt: Hat der statische Typ (Auto, Italienisches Auto) einen virtuellen Destructor, so werden alle Destructors von unten nach oben ab dem dynamischen Typ (Ferrari) ausgeführt Marc Rennhard, , CPP_Vererbung.ppt 33 Liegen Objekte auf dem Stack, so werden beim Freigeben des Speichers (zb beim Verlassen einer Methode/Funktion) immer alle Destructors, von unten (der Klasse des Objekts) nach oben (zur obersten Superklasse) ausgeführt, weil dann Polymorphismus und damit auch das Schlüsselwort virtual kein Rolle spielt. 33

34 Virtual Destructors (3) Ist der Destructor der Klasse Auto nicht virtual, werden von unten nach oben nur die Destructors ab dem statischen Typ ausgeführt: Auto *a = new Ferrari(); delete a; // Ausgabe: Bye bye Auto ItalienischesAuto *ia = new Ferrari(); delete ia; // Ausgabe: Addio Italienisches Auto Bye bye Auto Hat der statische Typ (und auch alle Superklassen davon) keinen Destructor, dann wird gar kein Destructor ausgeführt: Auto *a = new Ferrari(); // Auto hat keinen Destructor delete a; // Keine Ausgabe Rule of Thumb: Ein Destructor sollte dann virtual deklariert werden, wenn es mindestens eine andere virtuelle Methode hat Auch dann, wenn der Destructor nichts tut Sonst besteht die Gefahr, dass Destructors von Subklassen nicht ausgeführt werden Marc Rennhard, , CPP_Vererbung.ppt 34 Der Grund für die Rule of Thumb liegt daran, dass Objekte einer Klasse (und ihrer Subklassen) prinzipiell polymorph verwendet werden können, wenn mindestens eine Methode virtual ist. In diesen Fällen sollte man den Destructor nicht nicht polymorph machen, indem man keinen virtuellen Destructor zur Verfügung stellt. In unserem Beispiel sollte man also in der Klasse Auto also einen leeren, virtuellen Destructor einfügen, denn die Klasse hat eine virtuelle Methode Auto. Dieser leere virtuelle Destructor muss nur in der obersten Klasse mit virtuellen Methoden eingefügt werden, eine weitere Programmierung eines leeren virtuellen Destructors in der Klasse ItalienischesAuto ist also nicht nötig, denn das polymorphe Verhalten des Destructors ist durch das Einfügen des virtuellen Destructors in der Klasse Auto garantiert. In Java verhalten sich Destructors (die finalize() Methode) immer wie virtual Destructors in C++. 34

35 Operator Overloading und Vererbung (1) Auch vom Programmierer überladene Operatoren werden vererbt Klasse rect (Operator Overloading Kapitel) Klasse quader: class rect { // quader.cpp int x, int y; rect (): x(0), y(0) { rect & operator ++ () { // Prefix ++ Operator ++x; ++y; return *this; ostream & operator << (ostream & os, const rect & r) { return os << r.x << " * " << r.y << " = " << r.x * r.y;... Marc Rennhard, , CPP_Vererbung.ppt 35 35

36 Operator Overloading und Vererbung (2)... class quader : public rect { int z; quader () :z(0) { // Constructor Chaining, ruft rect() auf Testprogramm: quader c1; ++c1; // x und y (von rect) werden inkrementiert, nicht aber z cout << c1 << endl; // Ausgabe: 1 * 1 = 1 quader erbt also die Operatoren von rect, dahinter steckt folgendes: Der ++ Operator ist einfach eine normale Methode und wird darum vererbt Der (einzige) Parameter (rect) ist eine Superklasse von quader Darum funktioniert die Methode auch mit quader Der << Operator ist als Funktion implementiert und damit nicht Teil einer Klasse Womit die Funktion auch nicht vererbt wird quader kann die Funktion verwenden weil wiederum quader eine Subklasse von rect ist Marc Rennhard, , CPP_Vererbung.ppt 36 36

37 Operator Overloading und Vererbung (3) Für die gewünschte Funktionalität für quader kann man die Operatoren als Methode neu implementieren oder eine weitere Funktion zufügen: class quader : public rect {... quader & operator ++ () { ++x; ++y; ++z; return *this; ostream & operator << (ostream & os, const quader & c) { return os << c.x << " * " << c.y << " * " << c.z << " = " << c.x * c.y * c.z; Testprogramm: quader c1; ++c1; // x, y und z werden inkrementiert quader << c1 << endl; // Ausgabe: 1 * 1 * 1 = 1 Marc Rennhard, , CPP_Vererbung.ppt 37 Man beachte: Der << Operator ist nun zweimal als Funktion definiert, einmal für rect und einmal für quader. Weil die Funktionen aber verschiedenen Signaturen haben, ist die kein Problem. Polymorphismus gilt übrigens auch für überladene Operatoren, die als Methode implementiert sind. Wie bei normalen Methoden müssen diese aber als virtual deklariert werden, damit Polymorphismus überhaupt funktionieren kann. Dazu müsste als der ++ Operator in der Klasse rect wie folgt implementiert werden: virtual rect & operator ++ () { ++x; ++y; return *this; Mit Operatoren, die als Funktion ausserhalb von Klassen überladen sind, funktioniert Polymorphismus nicht. 37

38 Übung 2 zu Vererbung und Polymorphismus class Person { char nachname[20]; protected: Person* partner; Person (const char* n) { strcpy(nachname, n); partner = NULL; void heirat (Person* p) {partner = p; const char* name() {return nachname; class Mann : public Person { Mann(const char* n) : Person(n) { class Frau : public Person { Frau(const char* n) : Person(n) { const char* maedchenname() { return nachname; int main() { Person *m = new Mann("Meier"); Person *f = new Frau("Frei"); cout << m->name() << endl; cout << f->name() << endl; m->heirat(f); cout << m->name() << endl; cout << f->name() << endl; 1. Fügen Sie die vom Programm benötigten #includes ein 2. Das Programm erzeugt trotzdem immer noch einen Kompilierfehler wieso? Korrigieren Sie den Fehler. 3. heirat(person*) soll geändert werden, dass beide Personen in einem Aufruf miteinander verheiratet werden 4. name() soll bei lediger Frau den Mädchennamen ausgeben, sonst den Familiennamen (Name des Ehemannes) Marc Rennhard, , CPP_Vererbung.ppt 38 38

39 Mehrfachvererbung (1) C++: Eine Klasse kann von mehreren Superklassen abgeleitet werden Mehrfachvererbung Wenn möglich sollte Mehrfachvererbung vermieden werden (fehleranfällig, verwirrend), dennoch kann es in einigen Fällen nützlich sein... und ein C++ Programmierer sollte zumindest die Grundidee verstanden haben Die Subklasse erbt die Eigenschaften aller Superklassen Prinzipiell ist Mehrfachvererbung auch ziemlich problemlos, schwieriger wird es aber, wenn folgendes auftritt: Zwei oder mehr Superklassen haben eine Methode mit der gleichen Signatur oder eine Instanzvariable mit dem gleichen Namen welche soll jetzt in der Subklasse verwendet werden? Zwei oder mehr Superklassen haben wiederum die gleiche Superklasse, ist diese Klasse (und deren Eigenschaften) jetzt doppelt vorhanden? a() A B a() Marc Rennhard, , CPP_Vererbung.ppt 39?? A C Java kennt keine Mehrfachvererbung, dafür Interfaces. Mit Interfaces kann man fast alles machen wie mit Mehrfachvererbung und vermeidet gleichzeitig die meisten Probleme von Mehrfachvererbung. Der Grund liegt daran, dass Interfaces keine Instanzvariablen haben (womit eine Instanzvariable in einer Java Klasse nie mehrmals vorkommen kann) und dass Interfaces nur Methodenköpfe, aber nicht die Methoden selbst definieren (womit eine Methode nicht doppelt vorhanden sein kann). 39

40 Mehrfachvererbung (2) Beispiel mit Klasse Werwolf, die von Monster und Wolf abstammt: Monster Werwolf Wolf class Monster { // mehrfach1.cpp void erschrecken() {cout << "buuuuhh!" << endl; class Wolf { void heulen() {cout << "heuuull!" << endl; class Werwolf : public Monster, public Wolf { int main() { Werwolf ww; ww.erschrecken(); // buuuuhh! ww.heulen(); // heuuull! Marc Rennhard, , CPP_Vererbung.ppt 40 40

41 Mehrfachvererbung (3) Erweiterung: Auch Wolf implementiert eine Methode erschrecken: // mehrfach2.cpp class Monster { void erschrecken() {cout << "buuuuhh!" << endl; class Wolf { void erschrecken() {cout << "fletsch!" << endl; void heulen() {cout << "heuuull!" << endl; class Werwolf : public Monster, public Wolf { int main() { Werwolf ww; ww.erschrecken(); // Kompilierfehler! ww.monster::erschrecken(); // buuuuhh! ww.wolf::erschrecken(); // fletsch! ww.heulen(); // heuuull! Werden mehrere Methoden (oder Instanzvariablen) mit der gleichen Signatur geerbt, so muss die Methode beim Aufruf eindeutig spezifiziert werden! (Klasse::) Marc Rennhard, , CPP_Vererbung.ppt 41 41

42 Mehrfachvererbung (4) Mehrfachvererbung mit gemeinsamer Basisklasse: class Monster { // mehrfach3.cpp protected: int opfer; Monster() : opfer(0) { void erschrecken() {cout << "buuuuhh!" << endl; class Beisser : public Monster { void friss() {cout << ++opfer << " Opfer!" << endl; class Zombie : public Monster { void friss() {cout << ++opfer << " Opfer!" << endl; class Vampir : public Beisser, public Zombie { int main() { Vampir dracula; dracula.friss(); // Kompilierfehler! dracula.erschrecken(); // Kompilierfehler! dracula.monster::erschrecken(); // Kompilierfehler! dracula.beisser::erschrecken(); // buuuuhh! dracula.zombie::erschrecken(); // buuuuhh! dracula.beisser::friss(); // 1 Opfer! dracula.zombie::friss(); // 1 Opfer! Monster Beisser Vampir Monster Zombie Auch hier gilt: Methoden (oder Instanzvariablen) müssen eindeutig spezifiziert werden! (Klasse::) Marc Rennhard, , CPP_Vererbung.ppt 42 Die beiden letzten Zeilen geben jeweils 1 Opfer aus, da dracula einmal über den Beisser-Pfad und einmal über den Zombie-Pfad frisst. Weil in dracula Monster doppelt vorhanden ist, ist auch die Instanzvariable opfer doppelt vorhanden. 42

43 Mehrfachvererbung (5) Virtuelle Mehrfachvererbung bewirkt, dass eine gemeinsame Basisklasse nur einmal vererbt wird Dazu wird das Keyword virtual verwendet Hat nichts mit dem virtual bei virtual Methoden zu tun ( shared wäre hier wohl besser gewesen) Dadurch ist eine genauere Bezeichnung der verwendeten Methoden und Instanzvariablen der gemeinsamen Basisklasse Monster nicht mehr nötig Beisser Monster Vampir Zugriffe auf Methoden mit gleichen Signaturen oder Instanzvariablen mit dem gleichen Namen in den Klassen Beisser und Zombie müssen aber immer noch eindeutig spezifiziert werden! Auf Einfachvererbung oder Mehrfachvererbung ohne gemeinsame Basisklasse hat das Keyword virtual keinen Einfluss Zombie Marc Rennhard, , CPP_Vererbung.ppt 43 43

44 Mehrfachvererbung (6) Monster Beisser Zombie Vampir mit virtual Vererbung: Monster class Monster { // mehrfach4.cpp protected: int opfer; Monster() : opfer(0) { void erschrecken() {cout << "buuuuhh!" << endl; class Beisser : public virtual Monster { void friss() {cout << ++opfer << " Opfer!" << endl; class Zombie : public virtual Monster { void friss() {cout << ++opfer << " Opfer!" << endl; class Vampir : public Beisser, public Zombie { Beisser int main() { Vampir dracula; dracula.friss(); // Kompilierfehler! dracula.erschrecken(); // buuuuhh! dracula.monster::erschrecken(); // buuuuhh!; Monster optional dracula.beisser::erschrecken(); // buuuuhh!; Beisser optional dracula.zombie::erschrecken(); // buuuuhh!; Zombie optional dracula.beisser::friss(); // 1 Opfer!; Beisser notwendig dracula.zombie::friss(); // 2 Opfer!; Zombie notwendig Vampir Zombie Marc Rennhard, , CPP_Vererbung.ppt 44 Weil dracula nun nur noch einmal die Eigenschaften von Monster erbt, ist auch die Instanzvariable opfer nur einmal vorhanden und die friss()-methode von Beisser oder Zombie verwendet immer diese Instanzvariable, unabhängig davon, ob dracula über den Beisser-Pfad oder den Zombie- Pfad frisst. Deshalb wird nach dem zweiten Fressen 2 Opfer ausgegeben. 44

45 Zusammenfassung In C++ gibt es public, protected und private Vererbung, womit die Sichtbarkeit von Instanzvariablen und Methoden in Subklassen eingeschränkt werden kann Bei Method Overriding implementiert eine Subklasse eine Methode einer Superklasse neu (gleiche Signatur ist notwendig); dadurch ist die alte Methode in der Subklasse nicht mehr sichtbar Polymorphismus bedeutet, dass eine Variable vom Typ einer Superklasse irgendeine Variable vom Typ einer Subklasse beinhalten kann Werden einander direkt Objekte (und nicht Pointer) zugewiesen, so werden immer die Methoden des statischen Typs der Variablen verwendet Werden einander Pointer auf Objekte zugewiesen, so werden die Methoden des dynamischen Typs verwendet, wenn die entsprechende Methode als virtual definiert wurde Mit einem Dynamic Cast kann eine polymorphe Variable in ihren dynamischen Typ konvertiert werden Überladene Operatoren werden auch vererbt C++ unterstützt Mehrfachvererbung; nach Möglichkeit sollte diese aber wegen ihrer Fehleranfälligkeit und Unübersichtlichkeit vermieden werden Marc Rennhard, , CPP_Vererbung.ppt 45 45

Einführung in C++ Vererbung und Polymorphismus

Einführung in C++ Vererbung und Polymorphismus Einführung in C++ Vererbung und Polymorphismus Ablauf Grundlegende Eigenschaften der Vererbung in C++ Redefinition und Namensauflösung Eine einfache Klassenhierarchie in Java und C++ Redefinition von virtuellen

Mehr

1. Grundlegende Eigenscha5en 2. Redefini+on 3. Polymophie 4. Mehrfachvererbung

1. Grundlegende Eigenscha5en 2. Redefini+on 3. Polymophie 4. Mehrfachvererbung K05 Vererbung & Polymorphie in C++ 1. Grundlegende Eigenscha5en 2. Redefini+on 3. Polymophie 4. Mehrfachvererbung 2 Vererbung in C++: Grundlagen Analog zu Java unterstützt C++ das Konzept der Vererbung:

Mehr

OOP und Angewandte Mathematik. Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik

OOP und Angewandte Mathematik. Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik WS 2011/12 Inhalt Test-Besprechung! Ziele verdeutlichen Große Bild von OOP Wiederholung: Einbettung als Technik

Mehr

C++ - Einführung in die Programmiersprache Polymorphismus und Vererbung. Eltern

C++ - Einführung in die Programmiersprache Polymorphismus und Vererbung. Eltern C++ - Einführung in die Programmiersprache Polymorphismus und Vererbung Eltern Kind Kind Vererbung Definition von Klassen auf Basis von bestehenden Klassen. Implementierung von ist ein. bildet ein hierarchisches

Mehr

12. Vererbung. Prof. Dr. Markus Gross Informatik I für D-ITET (WS 03/04)

12. Vererbung. Prof. Dr. Markus Gross Informatik I für D-ITET (WS 03/04) 12. Vererbung Prof. Dr. Markus Gross Informatik I für D-ITET (WS 03/04)!Vererbung Konzept!Protected Section!Virtuelle Mitgliedsfunktionen!Verwendung von Vererbung Copyright: M. Gross, ETHZ, 2003 2 Vererbung!

Mehr

Vererbung & Schnittstellen in C#

Vererbung & Schnittstellen in C# Vererbung & Schnittstellen in C# Inhaltsübersicht - Vorüberlegung - Vererbung - Schnittstellenklassen - Zusammenfassung 1 Vorüberlegung Wozu benötigt man Vererbung überhaubt? 1.Um Zeit zu sparen! Verwendung

Mehr

Klassenbeziehungen & Vererbung

Klassenbeziehungen & Vererbung Klassenbeziehungen & Vererbung VL Objektorientierte Programmierung Raimund Kirner teilweise nach Folien von Franz Puntigam, TU Wien Überblick Arten von Klassenbeziehungen Untertypen versus Vererbung in

Mehr

Kapitel 6. Vererbung

Kapitel 6. Vererbung 1 Kapitel 6 2 Ziele Das sprinzip der objektorientierten Programmierung verstehen Und in Java umsetzen können Insbesondere folgende Begriffe verstehen und anwenden können: Ober/Unterklassen Subtyping Überschreiben

Mehr

Angewandte Mathematik und Programmierung

Angewandte Mathematik und Programmierung Angewandte Mathematik und Programmierung Einführung in das Konzept der objektorientierten Anwendungen zu mathematischen Rechnens WS2013/14 Inhalt Übung(Aufklärung) Vererbung(wdh.) Initilisierung bei Vererbung

Mehr

Programmieren in Java

Programmieren in Java Programmieren in Java objektorientierte Programmierung 2 2 Zusammenhang Klasse-Datei In jeder *.java Datei kann es genau eine public-klasse geben wobei Klassen- und Dateiname übereinstimmen. Es können

Mehr

Kapitel 6. Vererbung

Kapitel 6. Vererbung Kapitel 6 Vererbung Vererbung 1 Ziele Das Vererbungsprinzip der objektorientierten Programmierung verstehen Und in Java umsetzen können Insbesondere folgende Begriffe verstehen und anwenden können: Ober/Unterklassen

Mehr

Kapitel 6. Vererbung

Kapitel 6. Vererbung 1 Kapitel 6 2 Ziele Das sprinzip der objektorientierten Programmierung verstehen Und in Java umsetzen können Insbesondere folgende Begriffe verstehen und anwenden können: Ober/Unterklassen Subtyping Überschreiben

Mehr

GetName(), GetName(), GetGeschlecht() und AelterWerden().

GetName(), GetName(), GetGeschlecht() und AelterWerden(). 11. Vererbung Vererbung ist eine der mächtigsten Funktionalitäten der objektorientierten Programmiersprachen. Man versteht unter Vererbung die Tatsache, dass eine Klasse alle Methoden und Variablen einer

Mehr

Folge 18 - Vererbung

Folge 18 - Vererbung Workshop Folge 18 - Vererbung 18.1 Ein einfacher Fall der Vererbung Schritt 1 - Vorbereitungen Besorgen Sie sich - vielleicht aus einer der Übungen der Folge 17 - ein fertiges und lauffähiges Listenprojekt,

Mehr

Probeklausur: Programmierung WS04/05

Probeklausur: Programmierung WS04/05 Probeklausur: Programmierung WS04/05 Name: Hinweise zur Bearbeitung Nimm Dir für diese Klausur ausreichend Zeit, und sorge dafür, dass Du nicht gestört wirst. Die Klausur ist für 90 Minuten angesetzt,

Mehr

13. Vererbung. Prof. Dr. François E. Cellier Informatik I für D-ITET (HS 2012)

13. Vererbung. Prof. Dr. François E. Cellier Informatik I für D-ITET (HS 2012) 13. Vererbung Prof. Dr. François E. Cellier Informatik I für D-ITET (HS 2012) Vererbung Konzept Protected Section Virtuelle Mitgliedsfunktionen Verwendung von Vererbung Vererbung Vererbung ist ein Mechanismus,

Mehr

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java 1 / 41 Einstieg in die Informatik mit Java Vererbung Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 41 1 Überblick: Vererbung 2 Grundidee Vererbung 3 Verdeckte Variablen

Mehr

3 Objektorientierte Konzepte in Java

3 Objektorientierte Konzepte in Java 3 Objektorientierte Konzepte in Java 3.1 Klassendeklarationen Fragen an die Klassendeklaration: Wie heißt die Klasse? Wer darf auf die Klasse und ihre Attribute/Methoden zugreifen? Ist die Klasse eine

Mehr

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen Algorithmen und Datenstrukturen Tafelübung 03 Vererbung, Polymorphie, Sichtbarkeit, Interfaces Clemens Lang T2 11. Mai 2010 14:00 16:00, 00.152 Tafelübung zu AuD 1/26 Klassen und Objekte Klassen und Objekte

Mehr

3. Konzepte der objektorientierten Programmierung

3. Konzepte der objektorientierten Programmierung 3. Konzepte der objektorientierten Programmierung 3.1 Basiskonzepte 3.2 Generalisierung / Spezialisierung 3.3 Aggregation 3.4 Assoziation 3.5 Nachrichten 3.6 Polymorphismus 3. Konzepte der Objektorientierung

Mehr

Objektorientierte Programmierung mit C++ Vector und List

Objektorientierte Programmierung mit C++ Vector und List Vector und List Ziel, Inhalt Wir lernen die Klassen vector und list aus der Standard-C++ Library kennen und anwenden. In einer Übung wenden wir diese Klassen an um einen Medienshop (CD s und Bücher) zu

Mehr

Java Einführung Methoden in Klassen

Java Einführung Methoden in Klassen Java Einführung Methoden in Klassen Lehrziel der Einheit Methoden Signatur (=Deklaration) einer Methode Zugriff/Sichtbarkeit Rückgabewerte Parameter Aufruf von Methoden (Nachrichten) Information Hiding

Mehr

Deklarationen in C. Prof. Dr. Margarita Esponda

Deklarationen in C. Prof. Dr. Margarita Esponda Deklarationen in C 1 Deklarationen Deklarationen spielen eine zentrale Rolle in der C-Programmiersprache. Deklarationen Variablen Funktionen Die Deklarationen von Variablen und Funktionen haben viele Gemeinsamkeiten.

Mehr

C++ - Eine Ubersicht fur Java-Programmierer

C++ - Eine Ubersicht fur Java-Programmierer C++ - Eine Ubersicht fur Java-Programmierer Daniel Wasserrab Lehrstuhl fur Programmierparadigmen Universitat Karlsruhe 23. April 2008 C++ I Entwickelt Anfang der 80er von Bjarne Stroustrup I Beeinut von

Mehr

7. Objektorientierte Softwareentwicklung/3. Informatik II für Verkehrsingenieure

7. Objektorientierte Softwareentwicklung/3. Informatik II für Verkehrsingenieure 7. Objektorientierte Softwareentwicklung/3 Informatik II für Verkehrsingenieure Überblick FOLGENDE BEGRIFFE/PRINZIPIEN SOLLTEN BEKANNT SEIN Objekte Klasse Attribute Fähigkeiten ZIEL DER HEUTIGEN LEHRVERANSTALTUNG

Mehr

Java Schulung (Java 2 Java Development Kit 5 / 6)

Java Schulung (Java 2 Java Development Kit 5 / 6) 2. Grundlagen der Objektorientierung 2.1 Klassen, Attribute, Methoden Klassen Eine Klasse beschreibt als Bauplan Gemeinsamkeiten einer Menge von Objekten ist also ein Modell, auf dessen Basis Objekte erstellt

Mehr

Vorkurs C++ Programmierung

Vorkurs C++ Programmierung Vorkurs C++ Programmierung Klassen Letzte Stunde Speicherverwaltung automatische Speicherverwaltung auf dem Stack dynamische Speicherverwaltung auf dem Heap new/new[] und delete/delete[] Speicherklassen:

Mehr

5.6 Vererbung. Vererbung

5.6 Vererbung. Vererbung 5.6 Vererbung Klassen können zueinander in einer "ist ein"- Beziehung stehen Beispiel: Jeder PKW ist ein Kraftfahrzeug, jedes Kraftfahrzeug ist ein Transportmittel aber: auch jeder LKW ist ein Kraftfahrzeug

Mehr

Angewandte Mathematik und Programmierung

Angewandte Mathematik und Programmierung Angewandte Mathematik und Programmierung Einführung in das Konzept der objektorientierten Anwendungen zu mathematischen Rechnens WS 2013/14 Die Vererbung ermöglicht es, neue Klassen auf der Basis von schon

Mehr

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden. Grundwissen Informatik Objekt Attribut Methoden Als Objekte bezeichnet man alle Gegenstände, Dinge, Lebewesen, Begriffe oder Strukturen unserer Welt ( Autos, Räume, Bakterien, Lehrer, Schüler, Kunden,

Mehr

3 Objektorientierte Konzepte in Java

3 Objektorientierte Konzepte in Java 3 Objektorientierte Konzepte in Java Bisherige Beobachtungen zu Objekten: werden in Klassen zusammengefasst besitzen Eigenschaften und Verhalten verbergen private Informationen werden geboren, leben und

Mehr

1 Polymorphie (Vielgestaltigkeit)

1 Polymorphie (Vielgestaltigkeit) 1 Polymorphie (Vielgestaltigkeit) Problem: Unsere Datenstrukturen List, Stack und Queue können einzig und allein int-werte aufnehmen. Wollen wir String-Objekte, andere Arten von Zahlen oder andere Objekttypen

Mehr

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java: Technische Informatik für Ingenieure (TIfI) WS 2005/2006, Vorlesung 9 II. Grundlagen der Programmierung Ekkart Kindler Funktionen und Prozeduren Datenstrukturen 9. Datenstrukturen Daten zusammenfassen

Mehr

Objects First With Java A Practical Introduction Using BlueJ. Mehr über Vererbung. Exploring polymorphism 1.0

Objects First With Java A Practical Introduction Using BlueJ. Mehr über Vererbung. Exploring polymorphism 1.0 Objects First With Java A Practical Introduction Using BlueJ Mehr über Vererbung Exploring polymorphism 1.0 Zentrale Konzepte dieses Kapitels Methoden-Polymorphie statischer und dynamischer Typ Überschreiben

Mehr

2.4.3 Polymorphie (Wiederholung von Alp2)

2.4.3 Polymorphie (Wiederholung von Alp2) 2.4.3 Polymorphie (Wiederholung von Alp2) Sparbuch einsparbuch = new Sparbuch(3.0); Konto einkonto; KontoDrucker = new KontoDrucker(); KontoDrucker.setzeKonto(einSparbuch); einkonto = einsparbuch; Wie

Mehr

Grundkurs C++ IDE Klassenhierarchien

Grundkurs C++ IDE Klassenhierarchien Grundkurs C++ IDE Klassenhierarchien Martin Knopp 03.05.2017 Folie 1/34 GK C++: IDE, Klassenhierarchien Martin Knopp 03.05.2017 IDE Integrated Development Environment Wir empfehlen: Qt Creator (Bestandteil

Mehr

Java: Vererbung. Teil 3: super() www.informatikzentrale.de

Java: Vererbung. Teil 3: super() www.informatikzentrale.de Java: Vererbung Teil 3: super() Konstruktor und Vererbung Kindklasse ruft SELBSTSTÄNDIG und IMMER zuerst den Konstruktor der Elternklasse auf! Konstruktor und Vererbung Kindklasse ruft SELBSTSTÄNDIG und

Mehr

Programmieren - Vererbung & Polymorphie

Programmieren - Vererbung & Polymorphie Programmieren - Vererbung & Polymorphie Reiner Nitsch r.nitsch@fbi.h-da.de Vererbung - Was ist das? Vererbung ist ein wichtiges Konzept zur Unterstützung der Wiederverwendbarkeit, wenn auch nicht das Wichtigste.

Mehr

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

Grundzüge der Programmierung. Wiederverwendung VERERBUNG Grundzüge der Programmierung Wiederverwendung VERERBUNG Inhalt dieser Einheit Syntax: Vererbung in Java Superklassen - Subklassen Konstruktorenaufruf in Subklassen super, abstract und final 2 Code-Reuse

Mehr

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen Kapitel 9 Programmierkurs Birgit Engels Anna Schulze Zentrum für Angewandte Informatik Köln Objektorientierte Programmierung Attribute von Klassen, Methoden und Variablen Interfaces WS 07/08 1/ 18 2/ 18

Mehr

10. Klassen. Prof. Dr. Markus Gross Informatik I für D-ITET (WS 03/04)

10. Klassen. Prof. Dr. Markus Gross Informatik I für D-ITET (WS 03/04) 10. Klassen Prof. Dr. Markus Gross Informatik I für D-ITET (WS 03/04)!Objektorientierte Programmierung!Das Konzept der Klassen!Members!Objekte!Konstruktoren und Destruktoren!this-Pointer!Public und Private

Mehr

Programmieren in Java

Programmieren in Java Programmieren in Java Einführung in die objektorientierte Programmierung Teil 2 2 Übersicht der heutigen Inhalte Vererbung Abstrakte Klassen Erweitern von Klassen Überladen von Methoden Überschreiben von

Mehr

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen Algorithmen und Datenstrukturen Tafelübung 04 Referenzen, Overloading, Klassen(hierarchien) Clemens Lang T2 18. Mai 2010 14:00 16:00, 00.152 Tafelübung zu AuD 1/13 Organisatorisches Nächster Übungstermin

Mehr

Probeklausur: Programmierung WS04/05

Probeklausur: Programmierung WS04/05 Probeklausur: Programmierung WS04/05 Name: Hinweise zur Bearbeitung Nimm Dir für diese Klausur ausreichend Zeit, und sorge dafür, dass Du nicht gestört wirst. Die Klausur ist für 90 Minuten angesetzt,

Mehr

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf http://informatik.swoke.de. Seite 1 von 22

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf http://informatik.swoke.de. Seite 1 von 22 Kapitel 19 Vererbung, UML Seite 1 von 22 Vererbung - Neben der Datenabstraktion und der Datenkapselung ist die Vererbung ein weiteres Merkmal der OOP. - Durch Vererbung werden die Methoden und die Eigenschaften

Mehr

1. Übung zu "Numerik partieller Differentialgleichungen"

1. Übung zu Numerik partieller Differentialgleichungen 1. Übung zu "Numerik partieller Differentialgleichungen" Simon Gawlok, Eva Treiber Engineering Mathematics and Computing Lab 22. Oktober 2014 1 / 15 1 Organisatorisches 2 3 4 2 / 15 Organisatorisches Ort:

Mehr

Objektorientierte Programmierung

Objektorientierte Programmierung Objektorientierte Programmierung 1 Geschichte Dahl, Nygaard: Simula 67 (Algol 60 + Objektorientierung) Kay et al.: Smalltalk (erste rein-objektorientierte Sprache) Object Pascal, Objective C, C++ (wiederum

Mehr

Abschnitt 9: Schnittstellen: Interfaces

Abschnitt 9: Schnittstellen: Interfaces Abschnitt 9: Schnittstellen: Interfaces 9. Schnittstellen: Interfaces 9.1 Die Idee der Schnittstellen 9.2 Schnittstellen in Java 9.3 Marker-Interfaces 9.4 Interfaces und Hilfsklassen 9.5 Zusammenfassung

Mehr

Pass by Value Pass by Reference Defaults, Overloading, variable Parameteranzahl

Pass by Value Pass by Reference Defaults, Overloading, variable Parameteranzahl Funktionen Zusammenfassung von Befehlssequenzen als aufrufbare/wiederverwendbare Funktionen in einem Programmblock mit festgelegter Schnittstelle (Signatur) Derartige prozedurale Programmierung erlaubt

Mehr

Willkommen zur Vorlesung. Objektorientierte Programmierung Vertiefung - Java

Willkommen zur Vorlesung. Objektorientierte Programmierung Vertiefung - Java Willkommen zur Vorlesung Objektorientierte Programmierung Vertiefung - Java Zum Dozenten Mein Name: Andreas Berndt Diplom-Informatiker (TU Darmstadt) Derzeit Software-Entwickler für Web- Applikationen

Mehr

4 Vererbung, Polymorphie

4 Vererbung, Polymorphie 4 Vererbung, Polymorphie Jörn Loviscach Versionsstand: 21. März 2014, 22:57 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen beim Ansehen der Videos: http://www.j3l7h.de/videos.html This work

Mehr

Objektorientierung (OO)

Objektorientierung (OO) Objektorientierung (OO) Objekte haben Zustände (oder Eigenschaften, Attribute) und Verhalten Zustände: Objektvariablen (in Java auch fields) Verhalten (oder Aktionen): Methoden (methods, Funktionen) members

Mehr

Programmierung und Angewandte Mathematik

Programmierung und Angewandte Mathematik Programmierung und Angewandte Mathematik C++ /Scilab Programmierung und Einführung in das Konzept der objektorientierten Anwendungen zu wissenschaftlichen Rechnens SS 2012 Ziele Sie wissen, was Vererbung

Mehr

Prinzipien Objektorientierter Programmierung

Prinzipien Objektorientierter Programmierung Prinzipien Objektorientierter Programmierung Valerian Wintner Inhaltsverzeichnis 1 Vorwort 1 2 Kapselung 1 3 Polymorphie 2 3.1 Dynamische Polymorphie...................... 2 3.2 Statische Polymorphie........................

Mehr

Vererbung. Martin Wirsing. Ziele. Vererbung

Vererbung. Martin Wirsing. Ziele. Vererbung 2 Ziele Martin Wirsing en Begriff der einfachen verstehen und Redefinition von Oberklassenmethoden verstehen spolymorphie verstehen ie Klasse Object kennenlernen in Zusammenarbeit mit Michael Barth, Philipp

Mehr

Thema heute: Vererbung und Klassenhierarchien. Abgeleitete Klassen. Vererbung von Daten und Funktionen. Virtuelle Funktionen

Thema heute: Vererbung und Klassenhierarchien. Abgeleitete Klassen. Vererbung von Daten und Funktionen. Virtuelle Funktionen 1 Thema heute: Vererbung und Klassenhierarchien Abgeleitete Klassen Vererbung von Daten und Funktionen Virtuelle Funktionen 2 Vererbung oft besitzen verschiedene Datentypen einen gemeinsamen Kern Beispiel:

Mehr

Java Vererbung. Inhalt

Java Vererbung. Inhalt Java Vererbung Inhalt 1 Zielsetzung... 2 1.1 Bewertung... 2 2 Grundlagen der Vererbung... 2 2.1 Super und Subklassen... 2 3 Überladen von Methoden... 4 3.1 Unterschiedliche Parameter... 4 3.2 Gleiche Parameter

Mehr

Methoden. von Objekten definiert werden, Methoden,, Zugriffsmethoden und Read-Only

Methoden. von Objekten definiert werden, Methoden,, Zugriffsmethoden und Read-Only Methoden Wie Konstruktoren und Destruktoren zum Auf- und Abbau von Objekten definiert werden, Wie inline-methoden Methoden,, Zugriffsmethoden und Read-Only Only- Methoden einzusetzen sind, Der this-pointer

Mehr

Kompetent objektorientiert programmieren

Kompetent objektorientiert programmieren Kompetent objektorientiert programmieren Aegidius Plüss, Bern, www.aplu.ch Eine objektorientierte Programmiersprache steht auf drei fundamentalen Säulen: Klassenkapselung (encapsulation) Vererbung (inheritance)

Mehr

Algorithmen und Datenstrukturen 07

Algorithmen und Datenstrukturen 07 5. Dezember 2011 1 Besprechung Blatt 6 Fragen 2 Vererbung Allgemein abstract Interfaces 3 Unified Modeling Language (UML) Ablaufdiagramme Klassendiagramme Anwendungsfalldiagramme 4 Vorbereitung Blatt 7

Mehr

Javakurs für Anfänger

Javakurs für Anfänger Javakurs für Anfänger Einheit 02: Klassen & Objekte Lorenz Schauer Lehrstuhl für Mobile und Verteilte Systeme Heutige Agenda 1. Teil: Klassen Grundstruktur einer Java-Klasse Eigenschaften (Attribute) Variablen

Mehr

Einführung in das Objektorientierte Programmieren mit C++

Einführung in das Objektorientierte Programmieren mit C++ BEREICH DATENTECHNIK I CP 700 00 TH 03 Einführung in das Objektorientierte Programmieren mit C++ Kapitel 7 7. Laufzeit-Polymorphie 7.1. Frühes und spätes Binden 7.2. Virtuelle Funktionen FG TECHNISCHE

Mehr

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter Kapitel 1 Der vierte Tag 1.1 Vererbung Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter Sprachen. Unter Vererbung versteht man die Möglichkeit, Eigenschaften vorhandener

Mehr

Repetitorium Informatik (Java)

Repetitorium Informatik (Java) Repetitorium Informatik (Java) Tag 8 Lehrstuhl für Informatik 2 (Programmiersysteme) Übersicht 1 Vererbung Vererbung Statischer Typ Dynamischer Typ 2 Polymorphie Overloading: Methoden überladen Overriding:

Mehr

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Gerüstbeispiel. Vererbungshierarchie: Typ 0

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Gerüstbeispiel. Vererbungshierarchie: Typ 0 9 Objektorientierte Programmierung in Java Prof. Dr. Ing. André Stuhlsatz Wiederholung: Gerüstbeispiel Ein Duo, Quarto oder Sexto ist ein Gerüst. Die Klassen Duo, Quarto und Sexto sollen durch Vererbung

Mehr

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden Kapitel 8 Programmierkurs Birgit Engels Anna Schulze Zentrum für Angewandte Informatik Köln Objektorientierte Programmierung Methoden Überladen von Methoden Der this-zeiger Konstruktoren Vererbung WS 07/08

Mehr

Eine Einführung in C-Funktionen

Eine Einführung in C-Funktionen Eine Einführung in C-Funktionen CGK-Proseminar 2014 Philip Gawehn 04.07.2014, Hamburg Inhaltsverzeichnis 1 Einleitung 2 2 Grundlagen 2 2.1 Der Aufbau einer Funktion....................... 2 2.2 Schlüsselwörter.............................

Mehr

C++ - Objektorientierte Programmierung Vererbung

C++ - Objektorientierte Programmierung Vererbung C++ - Objektorientierte Programmierung Vererbung Personen Kunden Mitarbeiter Verwaltung Verkäufer Leibniz Universität IT Services Anja Aue Vererbung Definition von Klassen auf Basis von bestehenden Klassen.

Mehr

Überschreiben von Methoden

Überschreiben von Methoden Vergleich der DoME Realisierungen: Methode ausgeben Version 1 (ohne Vererbung): Anzeigen aller Informationen CD: A Swingin Affair (64 Min)* Frank Sinatra Titelanzahl: 16 Mein Lieblingsalbum von Sinatra

Mehr

C++ - Objektorientierte Programmierung Konstruktoren und Destruktoren

C++ - Objektorientierte Programmierung Konstruktoren und Destruktoren C++ - Objektorientierte Programmierung Konstruktoren und Destruktoren hat eine Kantenlänge hat eine Füllfarbe Kantenlänge setzen Füllfarbe lesen Volumen berechnen Leibniz Universität IT Services Anja Aue

Mehr

Musterlösung zur Vorlesung Modellbasierte Softwareentwicklung Wintersemester 2014/2015 Übungsblatt 9

Musterlösung zur Vorlesung Modellbasierte Softwareentwicklung Wintersemester 2014/2015 Übungsblatt 9 Prof. Dr. Wilhelm Schäfer Paderborn, 15. Dezember 2014 Christian Brenner Tristan Wittgen Musterlösung zur Vorlesung Modellbasierte Softwareentwicklung Wintersemester 2014/2015 Übungsblatt 9 Aufgabe 1 Codegenerierung

Mehr

Klassen in Java. Klassen

Klassen in Java. Klassen Klassen in Java Klassen Klassen beschreiben Objekte, die abstakte oder konkrete Sachverhalte modellieren. Objekte sind durch einen Status gekennzeichnet (State). Der Status eines Objektes ergibt sich aus

Mehr

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {... PIWIN I Kap. 8 Objektorientierte Programmierung - Vererbung 31 Schlüsselwort: final Verhindert, dass eine Methode überschrieben wird public final int holekontostand() {... Erben von einer Klasse verbieten:

Mehr

1 Abstrakte Klassen, finale Klassen und Interfaces

1 Abstrakte Klassen, finale Klassen und Interfaces 1 Abstrakte Klassen, finale Klassen und Interfaces Eine abstrakte Objekt-Methode ist eine Methode, für die keine Implementierung bereit gestellt wird. Eine Klasse, die abstrakte Objekt-Methoden enthält,

Mehr

Ziel, Inhalt. Programmieren in C++ Wir lernen wie man Funktionen oder Klassen einmal schreibt, so dass sie für verschiedene Datentypen verwendbar sind

Ziel, Inhalt. Programmieren in C++ Wir lernen wie man Funktionen oder Klassen einmal schreibt, so dass sie für verschiedene Datentypen verwendbar sind Templates und Containerklassen Ziel, Inhalt Wir lernen wie man Funktionen oder Klassen einmal schreibt, so dass sie für verschiedene Datentypen verwendbar sind Templates und Containerklassen 1 Ziel, Inhalt

Mehr

Repetitorium Informatik (Java)

Repetitorium Informatik (Java) Repetitorium Informatik (Java) Tag 6 Lehrstuhl für Informatik 2 (Programmiersysteme) Übersicht 1 Klassen und Objekte Objektorientierung Begrifflichkeiten Deklaration von Klassen Instanzmethoden/-variablen

Mehr

Die Programmiersprache C99: Zusammenfassung

Die Programmiersprache C99: Zusammenfassung Die Programmiersprache C99: Zusammenfassung Jörn Loviscach Versionsstand: 7. Dezember 2010, 19:30 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen in der Vorlesung. Videos dazu: http://www.youtube.com/joernloviscach

Mehr

Objektorientierte Programmierung. Kapitel 12: Interfaces

Objektorientierte Programmierung. Kapitel 12: Interfaces 12. Interfaces 1/14 Objektorientierte Programmierung Kapitel 12: Interfaces Stefan Brass Martin-Luther-Universität Halle-Wittenberg Wintersemester 2012/13 http://www.informatik.uni-halle.de/ brass/oop12/

Mehr

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur Unterprogramme Unterprogramme sind abgekapselte Programmfragmente, welche es erlauben, bestimmte Aufgaben in wiederverwendbarer Art umzusetzen. Man unterscheidet zwischen Unterprogrammen mit Rückgabewert

Mehr

Programmierkurs Java

Programmierkurs Java Programmierkurs Java Konstruktor, Statische Methoden Packages Prof. Dr. Stefan Fischer Institut für Telematik, Universität zu Lübeck http://www.itm.uni-luebeck.de/people/fischer Initialisierung von Datenstrukturen

Mehr

Prüfungszeuch im Fach Objektorientierte Programmierung WS 2000

Prüfungszeuch im Fach Objektorientierte Programmierung WS 2000 Prüfungszeuch im Fach Objektorientierte Programmierung WS 2000 A. Beschreibung der Projektarbeit. Welche Aufgabe haben Sie im Rahmen der Projektarbeit gelöst? 2. Mit welchen Tools bzw. Programmen (Anwendung,

Mehr

Die Bedeutung abstrakter Datentypen in der objektorientierten Programmierung. Klaus Kusche, September 2014

Die Bedeutung abstrakter Datentypen in der objektorientierten Programmierung. Klaus Kusche, September 2014 Die Bedeutung abstrakter Datentypen in der objektorientierten Programmierung Klaus Kusche, September 2014 Inhalt Ziel & Voraussetzungen Was sind abstrakte Datentypen? Was kann man damit grundsätzlich?

Mehr

11.3 Virtuelle Methoden

11.3 Virtuelle Methoden 11.3 Virtuelle Methoden Überdeckte Methoden: Betrachten wir noch einmal unsere Klassen Employee und Manager. class Employee void print() const cout

Mehr

Proseminar C-Programmierung. Strukturen. Von Marcel Lebek

Proseminar C-Programmierung. Strukturen. Von Marcel Lebek Proseminar C-Programmierung Strukturen Von Marcel Lebek Index 1. Was sind Strukturen?...3 2. Padding 5 3. Vor- und Nachteile von Padding..8 4. Padding gering halten 9 5. Anwendungsgebiete von Strukturen.11

Mehr

Test zu Grundlagen der Programmierung Leitung: Michael Hahsler. 21. November 2003

Test zu Grundlagen der Programmierung Leitung: Michael Hahsler. 21. November 2003 Test zu Grundlagen der Programmierung Leitung: Michael Hahsler 1. November 00 Name Martrikelnummer Unterschrift Bitte kreuzen Sie das Studium an, für das Sie diese Prüfung ablegen: O Bakkalaureat Wirtschaftsinformatik

Mehr

Java I Vorlesung 6 Referenz-Datentypen

Java I Vorlesung 6 Referenz-Datentypen Java I Vorlesung 6 Referenz-Datentypen 7.6.2004 Referenzen this, super und null Typkonvertierung von Referenztypen Finale Methoden und Klassen Datentypen in Java In Java gibt es zwei Arten von Datentypen:

Mehr

1. Von der Idee zur Software 2. Funktionen und Datenstrukturen Lehrbuch: 4.3 3. Organisation des Quellcodes 4. Werte- und Referenzsemantik

1. Von der Idee zur Software 2. Funktionen und Datenstrukturen Lehrbuch: 4.3 3. Organisation des Quellcodes 4. Werte- und Referenzsemantik Software-Technik: Vom Programmierer zur erfolgreichen Software-Technik: Vom Programmierer zur erfolgreichen 1. Von der Idee zur Software 2. Funktionen und Datenstrukturen Lehrbuch: 4.3 3. Organisation

Mehr

Anwendungsentwicklung mit Java. Grundlagen der OOP, Vererbung, Schnittstellen, Polymorphie

Anwendungsentwicklung mit Java. Grundlagen der OOP, Vererbung, Schnittstellen, Polymorphie Anwendungsentwicklung mit Java Grundlagen der OOP, Vererbung, Schnittstellen, Polymorphie Vererbung (1) 2 Problem: Objekte mit gleichen Attributen/Methoden, aber nicht völlig identisch, z.b., LKW, PKW,

Mehr

2. Semester, 2. Prüfung, Lösung

2. Semester, 2. Prüfung, Lösung 2. Semester, 2. Prüfung, Lösung Name Die gesamte Prüfung bezieht sich auf die Programmierung in C++! Prüfungsdauer: 90 Minuten Mit Kugelschreiber oder Tinte schreiben Lösungen können direkt auf die Aufgabenblätter

Mehr

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Interfaces

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Interfaces 10 Objektorientierte Programmierung in Java Prof. Dr. Ing. André Stuhlsatz Wiederholung: Interfaces Aber: Mehrfachvererbung von Klassen ist in Java nicht erlaubt. Ausweg Definition eines Interfaces, z.b.:

Mehr

Kapitel 9: Klassen und höhere Datentypen. Klassen und höhere. Objekte, Felder, Methoden. Küchlin/Weber: Einführung in die Informatik

Kapitel 9: Klassen und höhere Datentypen. Klassen und höhere. Objekte, Felder, Methoden. Küchlin/Weber: Einführung in die Informatik Klassen und höhere Datentypen Objekte, Felder, Methoden Küchlin/Weber: Einführung in die Informatik Klassen Klasse (class) stellt einen (i.a. benutzerdefinierten) Verbund-Datentyp dar Objekte sind Instanzen

Mehr

C++ Teil 5. Sven Groß. 13. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 18

C++ Teil 5. Sven Groß. 13. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 18 C++ Teil 5 Sven Groß 13. Mai 2016 Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 13. Mai 2016 1 / 18 Themen der letzten Vorlesung Funktionen Funktionsüberladung, Signatur Rekursion const-deklaration Referenzen

Mehr

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java 1 / 13 Einstieg in die Informatik mit Java Schnittstellen Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 13 1 Einführung 2 Definition einer Schnittstelle 3 Implementierung

Mehr

Beispiel: Zwischen der Oberklasse und der abgeleiteten Klasse besteht eine ist ein Beziehung. Eine abgeleitete Klasse stellt eine Spezialisierung der

Beispiel: Zwischen der Oberklasse und der abgeleiteten Klasse besteht eine ist ein Beziehung. Eine abgeleitete Klasse stellt eine Spezialisierung der Vererbung Vererbung ist ein Konzept der objektorientierten Programmierung,, die es ermöglicht neue Klassen von bereits vorhandenen Klassen abzuleiten. In einer abgeleiteten Klasse (subclass) muss nur spezifiziert

Mehr

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java 1 / 34 Einstieg in die Informatik mit Java Klassen mit Instanzmethoden Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 34 1 Definition von Klassen 2 Methoden 3 Methoden

Mehr

5.4 Klassen und Objekte

5.4 Klassen und Objekte 5.4 Klassen und Objekte Zusammenfassung: Projekt Figuren und Zeichner Figuren stellt Basisklassen für geometrische Figuren zur Verfügung Zeichner bietet eine übergeordnete Klasse Zeichner, welche die Dienstleistungen

Mehr

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java 1 / 22 Einstieg in die Informatik mit Java Generics Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 22 1 Überblick Generics 2 Generische Klassen 3 Generische Methoden 4

Mehr

Programmierkurs C++ Abstrakte Klassen und Methoden

Programmierkurs C++ Abstrakte Klassen und Methoden Programmierkurs C++ Abstrakte Klassen und Methoden Prof. Dr. Stefan Fischer Institut für Telematik, Universität zu Lübeck http://www.itm.uni-luebeck.de/people/fischer #2 Vererbungshierarchie Obst double

Mehr

Java für Computerlinguisten

Java für Computerlinguisten Java für Computerlinguisten 2. Objektorientierte Programmierung Christian Scheible Institut für Maschinelle Sprachverarbeitung 28. Juli 2009 Christian Scheible Java für Computerlinguisten 28. Juli 2009

Mehr

Software Engineering Klassendiagramme Einführung

Software Engineering Klassendiagramme Einführung Software Engineering Klassendiagramme Einführung Prof. Adrian A. Müller, PMP, PSM 1, CSM Fachbereich Informatik und Mikrosystemtechnik 1 Aufgabe Erstellen Sie eine Klasse Person in Java. Jede Person verfügt

Mehr