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

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 verstehen wie Polymorphismus

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

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

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

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

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

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

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

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

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren Lineargleichungssysteme: Additions-/ Subtraktionsverfahren W. Kippels 22. Februar 2014 Inhaltsverzeichnis 1 Einleitung 2 2 Lineargleichungssysteme zweiten Grades 2 3 Lineargleichungssysteme höheren als

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

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

Einführung in die Java- Programmierung

Einführung in die Java- Programmierung Einführung in die Java- Programmierung Dr. Volker Riediger Tassilo Horn riediger horn@uni-koblenz.de WiSe 2012/13 1 Wichtig... Mittags keine Pommes... Praktikum A 230 C 207 (Madeleine + Esma) F 112 F 113

Mehr

Einführung in die Programmierung (EPR)

Einführung in die Programmierung (EPR) Goethe-Center for Scientific Computing (G-CSC) Goethe-Universität Frankfurt am Main Einführung in die Programmierung (EPR) (Übung, Wintersemester 2014/2015) Dr. S. Reiter, M. Rupp, Dr. A. Vogel, Dr. K.

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

Einführung in die Programmierung

Einführung in die Programmierung Technische Universität München WS 2003/2004 Institut für Informatik Prof. Dr. Christoph Zenger Testklausur Einführung in die Programmierung Probeklausur Java (Lösungsvorschlag) 1 Die Klasse ArrayList In

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

Einführung in die Programmierung

Einführung in die Programmierung : Inhalt Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund - mit / ohne Parameter - mit / ohne Rückgabewerte

Mehr

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6 Gudrun Fischer Sascha Kriewel programmierung@is.informatik.uni-duisburg.de Anmeldung zur Klausur! Übungsblatt Nr. 6 Um an der Klausur teilzunehmen, müssen sich Studierende der angewandten Informatik in

Mehr

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom 21.10.2013b

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom 21.10.2013b AGROPLUS Buchhaltung Daten-Server und Sicherheitskopie Version vom 21.10.2013b 3a) Der Daten-Server Modus und der Tresor Der Daten-Server ist eine Betriebsart welche dem Nutzer eine grosse Flexibilität

Mehr

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag Ludwig-Maximilians-Universität München WS 2015/16 Institut für Informatik Übungsblatt 9 Prof. Dr. R. Hennicker, A. Klarl Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung:

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

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Java Kurs für Anfänger Einheit 4 Klassen und Objekte Java Kurs für Anfänger Einheit 4 Klassen und Ludwig-Maximilians-Universität München (Institut für Informatik: Programmierung und Softwaretechnik von Prof.Wirsing) 13. Juni 2009 Inhaltsverzeichnis klasse

Mehr

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Objektorientierte Programmierung für Anfänger am Beispiel PHP Objektorientierte Programmierung für Anfänger am Beispiel PHP Johannes Mittendorfer http://jmittendorfer.hostingsociety.com 19. August 2012 Abstract Dieses Dokument soll die Vorteile der objektorientierten

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

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

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

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

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

Primzahlen und RSA-Verschlüsselung

Primzahlen und RSA-Verschlüsselung Primzahlen und RSA-Verschlüsselung Michael Fütterer und Jonathan Zachhuber 1 Einiges zu Primzahlen Ein paar Definitionen: Wir bezeichnen mit Z die Menge der positiven und negativen ganzen Zahlen, also

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

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

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

5. Tutorium zu Programmieren

5. Tutorium zu Programmieren 5. Tutorium zu Programmieren Dennis Ewert Gruppe 6 Universität Karlsruhe Institut für Programmstrukturen und Datenorganisation (IPD) Lehrstuhl Programmierparadigmen WS 2008/2009 c 2008 by IPD Snelting

Mehr

Java Kurs für Anfänger Einheit 5 Methoden

Java Kurs für Anfänger Einheit 5 Methoden Java Kurs für Anfänger Einheit 5 Methoden Ludwig-Maximilians-Universität München (Institut für Informatik: Programmierung und Softwaretechnik von Prof.Wirsing) 22. Juni 2009 Inhaltsverzeichnis Methoden

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

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala Das Typsystem von Scala 1 Eigenschaften Das Typsystem von Scala ist statisch, implizit und sicher 2 Nichts Primitives Alles ist ein Objekt, es gibt keine primitiven Datentypen scala> 42.hashCode() res0:

Mehr

Arbeiten mit UMLed und Delphi

Arbeiten mit UMLed und Delphi Arbeiten mit UMLed und Delphi Diese Anleitung soll zeigen, wie man Klassen mit dem UML ( Unified Modeling Language ) Editor UMLed erstellt, in Delphi exportiert und dort so einbindet, dass diese (bis auf

Mehr

Zwischenablage (Bilder, Texte,...)

Zwischenablage (Bilder, Texte,...) Zwischenablage was ist das? Informationen über. die Bedeutung der Windows-Zwischenablage Kopieren und Einfügen mit der Zwischenablage Vermeiden von Fehlern beim Arbeiten mit der Zwischenablage Bei diesen

Mehr

5 DATEN. 5.1. Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

5 DATEN. 5.1. Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu Daten Makro + VBA effektiv 5 DATEN 5.1. Variablen Variablen können beliebige Werte zugewiesen und im Gegensatz zu Konstanten jederzeit im Programm verändert werden. Als Variablen können beliebige Zeichenketten

Mehr

Grundlagen von Python

Grundlagen von Python Einführung in Python Grundlagen von Python Felix Döring, Felix Wittwer November 17, 2015 Scriptcharakter Programmierparadigmen Imperatives Programmieren Das Scoping Problem Objektorientiertes Programmieren

Mehr

1 Mathematische Grundlagen

1 Mathematische Grundlagen Mathematische Grundlagen - 1-1 Mathematische Grundlagen Der Begriff der Menge ist einer der grundlegenden Begriffe in der Mathematik. Mengen dienen dazu, Dinge oder Objekte zu einer Einheit zusammenzufassen.

Mehr

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005 Einführung in die objektorientierte Programmierung mit Java Klausur am 19. Oktober 2005 Matrikelnummer: Nachname: Vorname: Semesteranzahl: Die Klausur besteht aus drei Frageblöcken zu den Inhalten der

Mehr

Klausur in Programmieren

Klausur in Programmieren Studiengang Sensorik/Sensorsystemtechnik Note / normierte Punkte Klausur in Programmieren Wintersemester 2010/11, 17. Februar 2011 Dauer: 1,5h Hilfsmittel: Keine (Wörterbücher sind auf Nachfrage erlaubt)

Mehr

Zählen von Objekten einer bestimmten Klasse

Zählen von Objekten einer bestimmten Klasse Zählen von Objekten einer bestimmten Klasse Ziel, Inhalt Zur Übung versuchen wir eine Klasse zu schreiben, mit der es möglich ist Objekte einer bestimmten Klasse zu zählen. Wir werden den ++ und den --

Mehr

1 Vom Problem zum Programm

1 Vom Problem zum Programm Hintergrundinformationen zur Vorlesung GRUNDLAGEN DER INFORMATIK I Studiengang Elektrotechnik WS 02/03 AG Betriebssysteme FB3 Kirsten Berkenkötter 1 Vom Problem zum Programm Aufgabenstellung analysieren

Mehr

1 topologisches Sortieren

1 topologisches Sortieren Wolfgang Hönig / Andreas Ecke WS 09/0 topologisches Sortieren. Überblick. Solange noch Knoten vorhanden: a) Suche Knoten v, zu dem keine Kante führt (Falls nicht vorhanden keine topologische Sortierung

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

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren: 5. Abstrakte Klassen Beispiel 5. Abstrakte Klassen 5. Abstrakte Klassen Beispiel Beispiel (3) Angenommen, wir wollen die folgende Klassenhierarchie implementieren: Probleme des Implementierungsvorschlags:

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

Computeranwendung und Programmierung (CuP)

Computeranwendung und Programmierung (CuP) Computeranwendung und Programmierung (CuP) VO: Peter Auer (Informationstechnologie) UE: Norbert Seifter (Angewandet Mathematik) Organisatorisches (Vorlesung) Vorlesungszeiten Montag 11:15 12:45 Freitag

Mehr

Ein Blick voraus. des Autors von C++: Bjarne Stroustrup. 04.06.2005 Conrad Kobsch

Ein Blick voraus. des Autors von C++: Bjarne Stroustrup. 04.06.2005 Conrad Kobsch Ein Blick voraus des Autors von C++: Bjarne Stroustrup 04.06.2005 Conrad Kobsch Inhalt Einleitung Rückblick Nur eine Übergangslösung? Was würde C++ effektiver machen? Quelle 2 Einleitung Wo steht C++,

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

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

Factory Method (Virtual Constructor)

Factory Method (Virtual Constructor) Factory Method (Virtual Constructor) Zweck: Definition einer Schnittstelle für Objekterzeugung Anwendungsgebiete: Klasse neuer Objekte bei Objekterzeugung unbekannt Unterklassen sollen Klasse neuer Objekte

Mehr

Programmieren in C. Macros, Funktionen und modulare Programmstruktur. Prof. Dr. Nikolaus Wulff

Programmieren in C. Macros, Funktionen und modulare Programmstruktur. Prof. Dr. Nikolaus Wulff Programmieren in C Macros, Funktionen und modulare Programmstruktur Prof. Dr. Nikolaus Wulff Der C Präprozessor Vor einem Compile Lauf werden alle Präprozessor Kommandos/Makros ausgewertet. Diese sind

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

13 OOP MIT DELPHI. Records und Klassen Ein Vergleich

13 OOP MIT DELPHI. Records und Klassen Ein Vergleich 13 OOP MIT DELPHI Delphi war früher "Object Pascal". Dieser Name impliziert eine Funktionalität, welche in der Welt der Programmierung nicht mehr wegzudenken ist: die objektorientierte Programmierung,

Mehr

Software Engineering Klassendiagramme Assoziationen

Software Engineering Klassendiagramme Assoziationen Software Engineering Klassendiagramme Assoziationen Prof. Adrian A. Müller, PMP, PSM 1, CSM Fachbereich Informatik und Mikrosystemtechnik 1 Lesen von Multiplizitäten (1) Multiplizitäten werden folgendermaßen

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

Typumwandlungen bei Referenztypen

Typumwandlungen bei Referenztypen Typumwandlungen bei Referenztypen Genau wie es bei einfachen Typen Typumwandlungen gibt, gibt es auch bei Referenztypen Umwandlungen von einem Referenztypen in einen anderen Referenztypen, die wie bei

Mehr

Angewandte Mathematik und Programmierung

Angewandte Mathematik und Programmierung Angewandte Mathematik und Programmierung Einführung in das Konzept der objektorientierten Anwendungen zu mathematischen Rechnens SS2013 Inhalt Projekt Vorlesung: praktische Implementierung üben Ein und

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

Anleitung über den Umgang mit Schildern

Anleitung über den Umgang mit Schildern Anleitung über den Umgang mit Schildern -Vorwort -Wo bekommt man Schilder? -Wo und wie speichert man die Schilder? -Wie füge ich die Schilder in meinen Track ein? -Welche Bauteile kann man noch für Schilder

Mehr

5. Abstrakte Klassen

5. Abstrakte Klassen 5. Abstrakte Klassen Beispiel 5. Abstrakte Klassen Angenommen, wir wollen die folgende Klassenhierarchie implementieren: Vogel Amsel Drossel Fink Peter Becker, Programiersprache Java FH Bonn-Rhein-Sieg,

Mehr

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung:

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung: Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Der Sourcecode wird an den entsprechenden Stellen im Programm wiederholt Programm wird lang

Mehr

L10N-Manager 3. Netzwerktreffen der Hochschulübersetzer/i nnen Mannheim 10. Mai 2016

L10N-Manager 3. Netzwerktreffen der Hochschulübersetzer/i nnen Mannheim 10. Mai 2016 L10N-Manager 3. Netzwerktreffen der Hochschulübersetzer/i nnen Mannheim 10. Mai 2016 Referentin: Dr. Kelly Neudorfer Universität Hohenheim Was wir jetzt besprechen werden ist eine Frage, mit denen viele

Mehr

Zur drittletzten Zeile scrollen

Zur drittletzten Zeile scrollen 1 Fragen und Antworten zur Computerbedienung Thema : Zur drittletzten Zeile scrollen Thema Stichwort Programm Letzte Anpassung Zur drittletzten Zeile scrollen Scrollen VBA Excel 1.02.2014 Kurzbeschreibung:

Mehr

Professionelle Seminare im Bereich MS-Office

Professionelle Seminare im Bereich MS-Office Der Name BEREICH.VERSCHIEBEN() ist etwas unglücklich gewählt. Man kann mit der Funktion Bereiche zwar verschieben, man kann Bereiche aber auch verkleinern oder vergrößern. Besser wäre es, die Funktion

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

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = 0.51129 Euro ergeben.

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = 0.51129 Euro ergeben. Aufgabe 1.30 : Schreibe ein Programm DM_in_Euro.java zur Umrechnung eines DM-Betrags in Euro unter Verwendung einer Konstanten für den Umrechnungsfaktor. Das Programm soll den DM-Betrag als Parameter verarbeiten.

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

4. BEZIEHUNGEN ZWISCHEN TABELLEN

4. BEZIEHUNGEN ZWISCHEN TABELLEN 4. BEZIEHUNGEN ZWISCHEN TABELLEN Zwischen Tabellen können in MS Access Beziehungen bestehen. Durch das Verwenden von Tabellen, die zueinander in Beziehung stehen, können Sie Folgendes erreichen: Die Größe

Mehr

Delegatesund Ereignisse

Delegatesund Ereignisse Delegatesund Ereignisse «Delegierter» Methoden Schablone Funktionszeiger Dr. Beatrice Amrhein Überblick Definition eines Delegat Einfache Delegate Beispiele von Delegat-Anwendungen Definition eines Ereignisses

Mehr

Javakurs zu Informatik I. Henning Heitkötter

Javakurs zu Informatik I. Henning Heitkötter Javakurs zu Informatik I Arrays vergleichen Implementieren Sie folgende Methode, die prüft, ob die Elemente der beiden Arrays an jeder Position übereinstimmen: public static boolean identisch(int[] a,

Mehr

Software-Engineering und Optimierungsanwendungen in der Thermodynamik

Software-Engineering und Optimierungsanwendungen in der Thermodynamik Software-Engineering und Optimierungsanwendungen in der Thermodynamik Software-Engineering 5 Programmentwicklung und Debuggen mit IDE und CASE-Tools Übungen Prof. Dr. Rolf Dornberger OPTSWE_SWE: 5 Programmentwicklung

Mehr

M. Graefenhan 2000-12-07. Übungen zu C. Blatt 3. Musterlösung

M. Graefenhan 2000-12-07. Übungen zu C. Blatt 3. Musterlösung M. Graefenhan 2000-12-07 Aufgabe Lösungsweg Übungen zu C Blatt 3 Musterlösung Schreiben Sie ein Programm, das die Häufigkeit von Zeichen in einem eingelesenen String feststellt. Benutzen Sie dazu ein zweidimensionales

Mehr

Objektbasierte Entwicklung

Objektbasierte Entwicklung Embedded Software Objektbasierte Entwicklung Objektorientierung in C? Prof. Dr. Nikolaus Wulff Objektbasiert entwickeln Ohne C++ wird meist C im alten Stil programmiert. => Ein endlose while-schleife mit

Mehr

Der lokale und verteilte Fall

Der lokale und verteilte Fall Lokale Beans Der lokale und verteilte Fall RemoteClient Lokaler Client (JSP) RemoteSession/Entity-Bean Lokale Session/Entity-Bean 2 Lokale Beans Die bisher vorgestellten EJBswaren immer in der Lage auf

Mehr

Objektorientierung: Klassen und Objekte

Objektorientierung: Klassen und Objekte Vorlesung und Übung Universität Paderborn Wintersemester 2015/2016 Dr. Peter Pfahler Objektorientierung: Klassen und Objekte EWS, WS 2015/16, Pfahler L-1 Objektorientierung behandelt in "Einführung in

Mehr

Menü auf zwei Module verteilt (Joomla 3.4.0)

Menü auf zwei Module verteilt (Joomla 3.4.0) Menü auf zwei Module verteilt (Joomla 3.4.0) Oft wird bei Joomla das Menü in einem Modul dargestellt, wenn Sie aber z.b. ein horizontales Hauptmenü mit einem vertikalen Untermenü machen möchten, dann finden

Mehr

Mediator 9 - Lernprogramm

Mediator 9 - Lernprogramm Mediator 9 - Lernprogramm Ein Lernprogramm mit Mediator erstellen Mediator 9 bietet viele Möglichkeiten, CBT-Module (Computer Based Training = Computerunterstütztes Lernen) zu erstellen, z. B. Drag & Drop

Mehr

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen Binäre Bäume 1. Allgemeines Binäre Bäume werden grundsätzlich verwendet, um Zahlen der Größe nach, oder Wörter dem Alphabet nach zu sortieren. Dem einfacheren Verständnis zu Liebe werde ich mich hier besonders

Mehr

Wie Sie mit Mastern arbeiten

Wie Sie mit Mastern arbeiten Wie Sie mit Mastern arbeiten Was ist ein Master? Einer der großen Vorteile von EDV besteht darin, dass Ihnen der Rechner Arbeit abnimmt. Diesen Vorteil sollten sie nutzen, wo immer es geht. In PowerPoint

Mehr

Testen mit JUnit. Motivation

Testen mit JUnit. Motivation Test First Design for Test in Eclipse (eigentlich: ) zu einer Klasse Beispiel zur Demonstration Ergänzungen Test First "Immer dann, wenn Du in Versuchung kommst, etwas wie eine print- Anweisung oder einen

Mehr

Modellierung und Programmierung 1

Modellierung und Programmierung 1 Modellierung und Programmierung 1 Prof. Dr. Sonja Prohaska Computational EvoDevo Group Institut für Informatik Universität Leipzig 19. November 2015 Gültigkeitsbereich (Scope) von Variablen { int m; {

Mehr

Gutes Leben was ist das?

Gutes Leben was ist das? Lukas Bayer Jahrgangsstufe 12 Im Hirschgarten 1 67435 Neustadt Kurfürst-Ruprecht-Gymnasium Landwehrstraße22 67433 Neustadt a. d. Weinstraße Gutes Leben was ist das? Gutes Leben für alle was genau ist das

Mehr

Objektorientierte Programmierung OOP

Objektorientierte Programmierung OOP Objektorientierte Programmierung OOP Objektorientierte Programmierung OOP Ronja Düffel WS2012/13 08. Oktober 2013 Objektorientierte Programmierung OOP Objektorientierte Programmierung Objektorientierte

Mehr

Arge Betriebsinformatik GmbH & Co.KG, CAP News 40, Februar 2013. CAP-News 40

Arge Betriebsinformatik GmbH & Co.KG, CAP News 40, Februar 2013. CAP-News 40 CAP-News 40 CAP-News ist in unrägelmäßigen Abständen erscheinende Information zum Produktkonfigurator CAP/VARIANTS. Hier werden die neuen Befehle, Funktionen und Möglichkeiten beschrieben. In CAP-News

Mehr

Einführung in die C++ Programmierung für Ingenieure

Einführung in die C++ Programmierung für Ingenieure Einführung in die C++ Programmierung für Ingenieure MATTHIAS WALTER / JENS KLUNKER Universität Rostock, Lehrstuhl für Modellierung und Simulation 14. November 2012 c 2012 UNIVERSITÄT ROSTOCK FACULTY OF

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

Erstellen einer Collage. Zuerst ein leeres Dokument erzeugen, auf dem alle anderen Bilder zusammengefügt werden sollen (über [Datei] > [Neu])

Erstellen einer Collage. Zuerst ein leeres Dokument erzeugen, auf dem alle anderen Bilder zusammengefügt werden sollen (über [Datei] > [Neu]) 3.7 Erstellen einer Collage Zuerst ein leeres Dokument erzeugen, auf dem alle anderen Bilder zusammengefügt werden sollen (über [Datei] > [Neu]) Dann Größe des Dokuments festlegen beispielsweise A4 (weitere

Mehr

Rundung und Casting von Zahlen

Rundung und Casting von Zahlen W E R K S T A T T Rundung und Casting von Zahlen Intrexx 7.0 1. Einleitung In diesem Werkstattbeitrag erfahren Sie, wie Zahlenwerte speziell in Velocity, aber auch in Groovy, gerundet werden können. Für

Mehr

Kulturelle Evolution 12

Kulturelle Evolution 12 3.3 Kulturelle Evolution Kulturelle Evolution Kulturelle Evolution 12 Seit die Menschen Erfindungen machen wie z.b. das Rad oder den Pflug, haben sie sich im Körperbau kaum mehr verändert. Dafür war einfach

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

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

Innere Klassen in Java

Innere Klassen in Java Innere Klassen in Java SS 2012 Prof. Dr. Margarita Esponda Innere Klassen Klassen- oder Interfacedefinitionen können zur besseren Strukturierung von Programmen verschachtelt werden Eine "Inner Class" wird

Mehr

Abschnitt 12: Strukturierung von Java-Programmen: Packages

Abschnitt 12: Strukturierung von Java-Programmen: Packages Abschnitt 12: Strukturierung von Java-Programmen: Packages 12. Strukturierung von Java-Programmen: Packages 12.1 Strukturierung durch Packages 12.2 Zugriffsspezifikationen 12.3 Zusammenfassung 12 Strukturierung

Mehr