Einführung in C++ Vererbung und Polymorphismus

Größe: px
Ab Seite anzeigen:

Download "Einführung in C++ Vererbung und Polymorphismus"

Transkript

1 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 Elementen und Polymorphismus Dynamische und Statische Typenumwandlung (Casts) Virtuelle Destruktoren Operatoren überladen und Vererbung Mehrfachvererbung 1

2 Ziele Sie wissen, was Vererbung prinzipiell ist, kennen den Unterschied zwischen public, protected und private Vererbung, und verstehen das Prinzip des Konstruktur-Aufbau Sie wissen, was Redefinition von Elementen bedeutet Sie verstehen, wie Polymorphismus in C++ funktioniert und welchen Einfluss dabei virtuelle Methoden haben Sie verstehen das Konzept von dynamischen und statischen Typenumwandlung (Casts) und können diese Casts anwenden Sie verstehen das Konzept der virtuellen Destruktoren und den Zusammenhang zwischen überladenen Operatoren und Vererbung Sie verstehen die grundlegende Idee von Mehrfachvererbung, die potentiellen Probleme, die dabei auftauchen, und wie man mit diesen Problemen umgeht Einführung (1) In C++ (wie in Java) können Klassen abgeleitet werden Vererbung Superklasse Subklasse Subklasse... Subklasse Subklasse Superklasse: Klasse, von welcher vererbt wird Subklasse: die Klasse, welche die Methoden erbt Von einer Subklasse können wiederum 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 2

3 Einführung (2) Eine Subklasse erbt alle public und protected (nicht aber private) Methoden und alle Datenelemente 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 Redefinition von Elementen Gilt auch für Datenelemente und statische Variablen Einführung (2) C++ unterstützt wie Java Polymorphismus: - eine Variable vom Typ einer Superklasse kann irgendeine Variable vom Typ einer Subklasse beinhalten Generell gilt: Vererbung und Polymorphismus werden flexibler gehandhabt als in Java, sind aber auch fehleranfälliger Beispiel: in Java ist eine Objektvariable immer,,polymorph", in C++ wird dies vom Programmierer kontrolliert 3

4 Vererbung (1) Definition einer abgeleiteten Klasse mit Doppelpunkt:und dem Zugriffs-Spezifizierer (Angabe der Zugriffsrechte): 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 Angabe der Zugriffsrechte nach dem Doppelpunkt weiter eingeschränkt werden: Variable/Methode in Superklasse public protected Subklasse vererbt als public protected private (Def.) Variable/Methode in Subklasse public protected private protected protected private private Kein Zugriff Kein Zugriff Kein Zugriff Vererbung (2) Man beachte, dass der Default Zugriffs-Spezifiziererprivate ist und nicht public auch wenn man in den allermeisten Fällen public benötigt. Java kennt diese Einschränkung mittels Zugriffs-Spezifizierer bei der Vererbung nicht es wird immer public vererbt Ein als protected deklariertes Element b ist wie ein privat- Element vor dem Zugriff von aussen geschützt Für Objekte der Super- und Subklasse ist dieses b nicht ansprechbar. Im Gegensatz zu einem private Element können aber Methoden abgeleiteter Klassen darauf zugreifen. 4

5 Vererbung (3) Beispiel zu private / protected / public Vererbung: a.priv++; a.prot++; a.publ++; b.priv++; b.prot++; b.publ++; class A { private: int priv; protected: int prot; int publ; Zugriff von aussen (f()) pxxx = private nein pxxx = protected nein nein ja nein nein nein pxxx = public ja class B : pxxx A { void m() {... void f() { A a; B b; Zugriff innerhalb von B (m()) priv++; prot++; publ++; unabhängig von pxxx nein ja ja Vererbung (4) private / protected Vererbung: allepublic Methoden der Superklasse sind in der Subklasse nicht mehr publicoft eine zu starke Einschränkung Abhilfe: explizite Wiederimplementierung der 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(); // Kompilerfehler, protected b.func2(); // OK, public Der Bereichsoperator :: wird allgemein dann gebraucht, wenn explizit auf eine Klasse zugegriffen werden soll private/protected Vererbung wird selten verwendet evtl. ein Hinweis auf unsauberes OO-Design! 5

6 Vererbung (5) private/protected Vererbung wird selten verwendet evtl. ein Hinweis auf unsauberes OO-Design! Dementsprechend wurde es in Java auch weggelassen. Vererbung (6) Konstruktoren: Ist B eine Subklasse von A, dann passiert bei der Initialisierung einer Instanz der Klasse B folgendes: Zuerst wird der Default-Konstruktor der Klasse A aufgerufen. Dann wird der (der Initialisierung) entsprechende Konstruktor der Klasse B aufgerufen Um einen anderen als den Default-Konstruktor der Klasse A aufzurufen, muss dies im Konstruktor der Klasse B mit einem Basisinitialisierer explizit angegeben werden (Java: super(...)) Existiert der Default- oder explizit angegebene Konstruktor in der Klasse A nicht, gibt es einen Fehler beim Kompilieren Destruktoren werden in umgekehrter Reihenfolge zu den Konstruktor aufgerufen (zuerst der Destruktor von Klasse B, dann der von Klasse A) 6

7 Vererbung (7) Beispiel: Aufruf der Konstruktoren (ohne Basisinitialisierer) #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) Vererbung (6) Beispiel: Aufruf der Konstruktoren (mit Basisinitialisierer) #include <iostream> Datenelemente von A using namespace std; werden sofort richtig class A { initialisiert (ohne extra den Default A() {cout << "Constructor A()" << endl; Konstruktor aufzurufen 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) 7

8 Redefinieren von Elementen (1) Redefinition (von nicht virtuellen Methoden): Für die Namen von Datenelementen oder Methoden in der Subklasse gibt es 2 Möglichkeiten Name in der Superklasse nicht vorhanden keine Redefinition Name in der Superklasse vorhandenredefinition Ein in der Subklasse redefiniertes Element verdeckt das entsprechende Element/Methode in der Superklasse Redefinition und Überladung Bei der Redefinition (von nicht virtuellen Methoden) darf die Signatur und der Return-Typ beider Methoden verschieden sein. Eine Redefinition einer Methode verdeckt immer die gleichnamige Methode des Superklasse. In derselben Klasse dürfen Methoden aber überladen sein. Deshalb kann eine Methode der Superklasse mehrfach redefiniert werden. Redefinition von Methoden 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 8

9 Redefinition von Methoden 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 Ausgabe: Name.cpp: In function `int main()': Name.cpp:11: error: no matching function for call to `Child::test()` Name.cpp:113: error: candidates are: void Child::test(int) Redefinition von Methoden in Subklassen (3) Grund für den Kompilierfehler: C++ geht bei der Namensauflösung 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 class Child : public Parent { void test() {Parent::test(); void test(int i) {cout << "test(int)" << endl; 9

10 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 Implementierung in Java // AutoProg.java abstract class Auto { abstract public void marke(); public class ItalienischesAuto extends Auto { public void marke() {System.out.println("Macchina Italiana"); public void fahre250() {System.out.println("geht nicht"); public class Fiat extends ItalienischesAuto { public void marke() {System.out.println("Fiat"); public class Ferrari extends ItalienischesAuto { public void marke() {System.out.println("Ferrari"); public void fahre250() {System.out.println("250!"); 10

11 Implementierung in C++ // autoprog.cpp class Auto { Rein virtuelle Methode 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; Redefinieren von Elementen (1) Redefinieren von Elementen : Eine Subklasse implementiert eine Methode einer Superklasse,,neu". 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; 11

12 Redefinieren von Elementen (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! Redefinieren von Elementen (3) Wenn in der Subklasse auf eine überschriebene Methode der Superklasse zugegriffen werden soll, kann man den Bereichsoperator:: verwenden. Aus der Klasse Ferrari kann damit die fahre250 Methode der Klasse ItalienischesAuto benutzt werden class Ferrari : public ItalienischesAuto {... void fahre250() { cout << "250!" << endl; ItalienischesAuto::fahre250(); Das entspricht der Funktionalität, die man mit dem Keyword super in Java erreicht. 12

13 Polymorphismus (1) Eines der wichtigsten Konzepte der OO Programmierung Polymorphismus: eine Variable vom Typ einer Superklasse kann irgendein Objekt vom Typ einer Subklasse beinhalten Anders gesagt: der statische 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 Redefinieren von Elementen 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 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 13

14 Polymorphismus (3) Polymorphismus in C++ mit Zuweisung von Objekten: Ferrari f; f.marke(); // Ferrari f.fahre250(); // 250! ItalienischesAuto ia = f; ia.marke(); // Macchina Italiana ia.fahre250(); // geht nicht Werden Objekte einander zugewiesen, so werden immer die Methoden des statischen Typs (ItalienischesAuto) verwendet in diesem Fall existiert gar kein Polymorphismus Bei der Zuweisung werden keine Zeiger 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 Polymorphismus (4) Polymorphismus in C++ mit Zuweisung von Zeigern: Ferrari f; f.marke(); // Ferrari f.fahre250(); // 250! ItalienischesAuto *ia = &f; ia->marke(); // Ferrari ia->fahre250(); // geht nicht < Werden statt Objekte Zeiger zugewiesen, so wird die Methode des dynamischen Typs (Ferrari) verwendet, wenn die entsprechende Methode als virtual definiert wurde (marke) Andernfalls wird die Methode des statischen Typs (Italienisches Auto) verwendet (fahre250) Polymorphismus in C++ entspricht also Polymorphismus in Java, wenn: Mit Zeigern gearbeitet wird Und wenn alle Methoden, die redefiniert werden sollen, als virtual definiert werden. 14

15 Polymorphismus (5) Polymorphismus funktioniert natürlich auch auf dem Heap, wo,,automatisch" mit Zeigern gearbeitet wird: Ferrari *f = new Ferrari(); f->marke(); // Ferrari f->fahre250(); // 250! ItalienischesAuto *ia = f; ia->marke(); // Ferrari ia->fahre250(); // geht nicht < Weil Referenzen nichts anderes als Zeiger sind, funktioniert Polymorphismus auch mit Referenzen: f.marke(); // Ferrari f.fahre250(); // 250! ItalienischesAuto &ia = f; ia.marke(); // Ferrari ia.fahre250(); // geht nicht < Polymorphismus (6) Redefinition von virtuellen Methoden In einer Subklasse wird eine virtuelle Methode redefiniert, wenn die Methode in der abgeleiteten Klasse dieselbe Signatur denselben Ergebnistyp wie die virtuelle Methode des Basisklasse hat. Wird eine virtuelle Methode in einer abgeleiteten Klasse mit einer anderen Signatur oder einem anderen Ergebnistyp redefiniert, so wird lediglich eine neue Methode mit gleichem Namen eingeführt und diese ist nicht virtuell. 15

16 Polymorphismus (7) Bei Polymorphismus spricht man oft von early binding (statische Bindung) und late binding (dynamische Bindung) 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 virtuell ist, kann in Subklassen nicht virtuell gemacht werden Ebenso bleibt eine virtuelle Methode immer virtuell, 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 virtuelle Methoden: virtual, kein Body, dafür =0 am Ende, z.b. Methode marke() Redefinieren von Elementen (5) Erweitern wir die Klasse ItalienischesAuto um 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 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 16

17 Redefinieren von Elementen (6) Erklärung: das liegt daran, ob die Methoden virtuell sind oder nicht: markefahre250 ist eine Methode von ItalienischesAuto markefahre250 ruft deshalb ebenfalls die Methoden marke und fahre250 von ItalienischesAuto auf fahre250 ist nicht virtuell 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 virtuelldie Methode des Typs der Variablen (Ferrari) ausgeführt Auch hier verhält sich C++ wie Java, wenn in C++ alle Methoden virtuell sind Polymorphismus (7) In C konnte der Code nur in eine Richtung erweitert werden: neuer Code ruft alten Code auf Polymorphismus ist ein objekt-orientierte Ansatz und erlaubt das alter Code ruft neuen Code auf 17

18 Polymorphismus (7)!" # # $ Die richtige Funktion wird NICHT aufgerufen! Ausgabe In Base::f(int x) In Base::f(int x) Polymorphismus (8)!" # # $ Polymorphe Funktion Derived::f redefiniert Base::f Die richtige Funktion wird aufgerufen Ausgabe In Base::f(int x) In Derived::f(int x) 18

19 Polymorphismus (9)!" # # $ Alter Code ruft neuen Code Zum Zeitpunkt der Erstellung von # muss die Klasse noch nicht existiert haben! Übung 1 zu Vererbung und Polymorphismus class Monster { virtual void augen(){cout<<":"; virtual void nase (){cout<<'-'; virtual void mund (){cout<<' '; void zeige() { augen(); nase(); mund(); cout << endl; Monster Beisser Vampir class Beisser : public Monster { virtual void mund() { cout<<'x'; virtual void beiss() { cout<<"beiss beisser"<<endl; class Vampir : public Beisser { virtual void augen() { cout<< "8"; virtual void mund() { cout << '#'; virtual void beiss() { cout<<"beiss vampir"<<endl; 19

20 Übung 1 zu Vererbung und Polymorphismus class Monster { virtual void augen(){cout<<":"; virtual void nase (){cout<<'-'; virtual void mund (){cout<<' '; void zeige() { augen(); nase(); mund(); cout << endl; Monster m; m.zeige(); Beisser b; b.zeige(); Vampir v; v.zeige(); m = v; m.zeige(); m = b; m.zeige(); // :- // :-X // 8-# // :- // :- class Beisser : public Monster { virtual void mund() { cout<<'x'; virtual void beiss() { cout<<"beiss beisser"<<endl; class Vampir : public Beisser { virtual void augen() { cout<< "8"; virtual void mund() { cout << '#'; virtual void beiss() { cout<<"beiss vampir"<<endl; Übung 1 zu Vererbung und Polymorphismus class Monster { virtual void augen(){cout<<":"; virtual void nase (){cout<<'-'; virtual void mund (){cout<<' '; void zeige() { augen(); nase(); mund(); cout << endl; Beisser* pb = new Beisser; Vampir* pv = new Vampir; pb->zeige(); pb->beiss(); pv->zeige(); pv->beiss(); pb = pv; pb->zeige(); pb->beiss(); // :-X // beiss beisser // 8-# // beiss vampir // 8-# // beiss vampir class Beisser : public Monster { virtual void mund() { cout<<'x'; virtual void beiss() { cout<<"beiss beisser"<<endl; class Vampir : public Beisser { virtual void augen() { cout<< "8"; virtual void mund() { cout << '#'; virtual void beiss() { cout<<"beiss vampir"<<endl; Zusatzfrage: Was verändert sich, wenn mund nicht virtual ist? 20

21 Downcasting Downcasting 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;... Dynamische Typumwandlung C++: kein instanceof, dafür ein spezieller Konvertierungstyp, der dynamische Cast dynamic cast < > Der Dynamic Cast prüft die Gültigkeit der Konvertierung und gibt im Fehlerfall den Wert 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) Ein Dynamic Cast funktioniert nur, wenn die entsprechende Variable polymorph ist, das heisst: Wenn ein Zeiger auf das Objekt verwendet wird Wenn die Klasse mindestens eine virtuelle Methode enthält 21

22 Statische Typumwandlung Es gibt auch einen static_cast: dabei wird der dynamische Typ nicht geprüft und es müssen keine Zeiger verwendet werden Sehr ähnlich wie ein,,normaler" Cast wie z.b. (Ferrari*) oder (int) Der Static Cast prüft jedoch den statischen Typeine Konvertierung von int* zu int oder unterschiedlichen Klassenhierarchien wird verhindert. Ist dem normalen Cast vorzuziehen. Beispiel für normale Casts und statischen Typumwandlung void* v =...; // Wir wissen, dass v auf einen Ferrari zeigt. Ferrari *fe = static_cast<ferrari*>(v); int *pi = new int; *pi = 12; int b = (int) pi; //normaler Cast int* -> int: OK, aber f 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 Virtuelle Destruktoren (1) Im Zusammenhang mit Polymorphismus und Objekten auf dem Heap stellt sich die Frage, ob ein Destruktor virtuell deklariert werden soll Erweiterung unserer Hierarchie mit Destruktor: class Auto { virtual ~Auto() {cout << "Bye bye Auto" << endl;... class Ferrari : public ItalienischesAuto { ~Ferrari() {cout << "Ciao Ferrari" << endl; Testprogramm: ItalienischesAuto *ia = new Ferrari(); delete ia; // Ausgabe: Ciao Ferrari, Bye bye Auto Also gilt: Mit einem virtuellen Destruktor werden alle Destruktoren von unten nach oben ab dem dynamischen Typ (Ferrari) ausgeführt 22

23 Virtuelle Destruktoren (2) Ist der Destruktor der Klasse Auto nicht virtuell, wird nur der Destruktor von Auto ausgeführt: ItalienischesAuto *ia = new Ferrari(); delete ia; // Ausgabe: Bye bye Auto Es werden also von unten nach oben nur die Destruktoren ab dem statischen Typ (ItalienischesAuto) ausgeführt Hat Auto gar keinen Destruktor (ItalienischesAuto auch nicht), dann wird gar kein Destruktor ausgeführt: ItalienischesAuto *ia = new Ferrari(); delete ia; // Keine Ausgabe Rule of Thumb: Ein Destruktor sollte dann virtuell deklariert werden, wenn es mindestens eine andere virtuelle Methode hat Auch dann, wenn der Destruktor,,nichts tut Sonst besteht die Gefahr, dass Destruktoren von Subklassen nicht ausgeführt werden Operator überladen und Vererbung (1) Überladene Operatoren werden vererbt #include <iostream> using namespace std; class Point2D { double x, y; Point2D& operator++() { ++x; ++y; return *this; Point2D() { x = y = 1; friend ostream& operator<< (ostream&, const Point2D&); class Point3D : public Point2D { double z; ostream& operator<<( ostream& o, const Point2D& c ) { o << c.x << " " << c.y << endl; return o; 23

24 Operator überladen und Vererbung (2) Testprogramm: Point3D c; ++c; // x, y (von Point2D) werden inkrementiert, nicht aber z cout << c; // Aufgabe von x, y, aber nicht z Point3D erbt die Operatoren von Point2D, wobei folgendes dahinter steckt: Der ++ Operator ist eine,,normale" Methode und wird darum vererbt. Der einzige Parameter vom ++ Operator (Point2D) ist eine Superklasse von Point3D. Darum funktioniert die Methode auch mit Point3D Der << Operator ist als Funktion implementiert und damit nicht Teil einer Klasse: Womit die Funktion auch nicht vererbt wird. Point3D kann die Funktion verwenden, weil wiederum Point3D eine Subklasse von Point2D ist Operator überladen und Vererbung (3) Für die gewünschte Funktionalität für Point3D können die Operatoren als Methode/Funktion neu implementiert werden: class Point3D : public Point2D { double z; Point3D& operator++() { ++x; ++y; ++z; return *this; friend ostream& operator<< (ostream&, const Point3D&); ostream& operator<<( ostream& o, const Point3D& c ) { o << c.x << " " << c.y << << c.z << endl; return o; Testprogramm: Point3D c; ++c; // x, y und z werden inkrementiert cout << c; // z.b. Ausgabe:

25 Operator überladen und Vererbung (4) Der << Operator ist nun zweimal als Funktion definiert (für Point2D und Point3D). Weil die Funktionen aber verschiedenen Signaturen haben, ist dies kein Problem. Polymorphismus gilt auch für überladene Operatoren, die als Methode implementiert sind. Wie bei normalen Methoden müssen diese als virtuell deklariert werden, damit Polymorphismus überhaupt funktionieren kann. Polymorphismus mit ++ Operator in der Klasse Point2D virtual Point2D& operator++() { ++x; ++y; return *this; Mit Operatoren, die als Funktion ausserhalb von Klassen überladen sind, funktioniert Polymorphismus nicht. 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 nützlich sein... Und man 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 Methode a() Subklasse Klasse A Klasse B1 Klasse B2 Subklasse Methode a() Instanzvariable mit dem gleichen Namen welche soll jetzt in der Subklasse verwendet werden? Zwei oder mehr Superklassen haben wiederum die gleiche Superklasse, die Klasse und deren Eigenschaften wären jetzt doppelt vorhanden 25

26 Mehrfachvererbung (2) Beispiel mit Klasse Werwolf, die von Monster und Wolf abstammt: Monster Wolf class Monster { 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! Werwolf Mehrfachvererbung (3) Erweiterung: Wolf implementiert eine Methode erschrecken: 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:: 26

27 Mehrfachvererbung (4) Mehrfachvererbung mit gemeinsamer Basisklasse: class Monster { protected: int opfer; Monster() : opfer(0) { void erschrecken() { cout<<"buuuuhh!"<<endl; class Beisser : public Monster{ void friss() {opfer++; class Zombie : public Monster{ void friss() {opfer++; class Vampir : public Beisser, public Zombie { Monster Beisser Vampir Monster Zombie int main() { Vampir dracula; dracula.friss(); //Kompilierfehler! dracula.erschrecken();//kompilierf. // Kompilierfehler! dracula.monster::erschrecken(); // buuuuhh! dracula.beisser::erschrecken(); // buuuuhh! dracula.zombie::erschrecken(); dracula.beisser::friss(); dracula.zombie::friss(); Mehrfachvererbung (4) Mehrfachvererbung mit gemeinsamer Basisklasse: class Monster { Monster Monster protected: int opfer; Beisser Zombie Vampir Monster() : opfer(0) { void erschrecken() Auch { hier gilt: Methoden int main() { cout<<"buuuuhh!"<<endl; (oder Instanzvariablen) Vampir dracula; müssen eindeutig dracula.friss(); //Kompilierfehler! class Beisser : public spezifiziert Monster{ werden! dracula.erschrecken();//kompilierf. Klasse:: // Kompilierfehler! void friss() {opfer++; dracula.monster::erschrecken(); // buuuuhh! class Zombie : public Monster{ dracula.beisser::erschrecken(); // buuuuhh! void friss() {opfer++; dracula.zombie::erschrecken(); dracula.beisser::friss(); class Vampir : public Beisser, dracula.zombie::friss(); public Zombie { 27

28 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 virtuellen Methoden zu tun (shared wäre hier wohl besser gewesen) Beisser Monster Vampir Zombie Dadurch ist eine genauere Bezeichnung der verwendeten Methoden und Instanzvariable der gemeinsamen Basisklasse Monster nicht mehr nötig 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 Mehrfachvererbung (6) Monster - Beisser - Zombie - Vampir mit virtual Vererbung class Monster { protected: int opfer; Monster() : opfer(0) { void erschrecken() { cout<<"buuuuhh!"<<endl; class Beisser : public virtual Monster{ void friss() {opfer++; class Zombie : public virtual Monster{ void friss() {opfer++; class Vampir : public Beisser, public Zombie { Beisser Monster Vampir Zombie Eine virtuelle Superklasse wirkt sich erst bei Mehrfachvererbung aus bleibt auch bei weiteren Ableitungen virtuell, so besitzt jede von Beisser abgeleitete Klasse die Klasse Monster ebenfalls als virtuelle Basisklasse. 28

29 Mehrfachvererbung (7) Monster - Beisser - Zombie - Vampir mit virtual Vererbung class Monster { protected: int opfer; Monster() : opfer(0) { int main() { void erschrecken() { cout<<"buuuuhh!"<<endl; Vampir dracula; dracula.friss(); //Kompilierfehler! dracula.erschrecken();//buuuuhh! class Beisser : public virtual Monster{ dracula.monster::erschrecken();//buuuuhh! void friss() {opfer++; dracula.beisser::erschrecken();//buuuuhh! dracula.zombie::erschrecken();//buuuuhh! class Zombie : public virtual dracula.beisser::friss(); Monster{ //Beisser notwendig dracula.zombie::friss(); //Zombie notwendig void friss() {opfer++; class Vampir : public Beisser, public Zombie { Zusammenfassung In C++ gibt es public, protected und private Vererbung, womit die Sichtbarkeit von Instanzvariablen und Methoden in Subklassen eingeschränkt werden kann Beim Redefinieren von Methoden implementiert eine Subklasse eine Methode einer Superklasse neu; dadurch ist die alte Methode in der Subklasse nicht mehr sichtbar. Polymorphismus bedeutet, dass eine Variable vom Typ einer Superklasse irgendeinevariable vom Typ einer Subklasse beinhalten kann Werden Objekte (und nicht Zeiger) zugewiesen, so werden immer die Methoden des statischen Typs der Variablen verwenden Werden Zeiger 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 29

9. Vererbung und Polymorphismus

9. Vererbung und Polymorphismus 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@zhaw.ch

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

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

01. Grundprinzipien der Vererbung

01. Grundprinzipien der Vererbung 01. Grundprinzipien der Vererbung 1.1 Grundidee der Vererbung Bei der Analyse eines Problems (z.b. Baukasten) stellt man beispielsweise fest, dass 67 % an Daten/Funktionen immer vorkommen 25 % an Daten/Funktionen

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

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

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung Javakurs FSS 2012 Lehrstuhl Stuckenschmidt Tag 3 - Objektorientierung Warum Objektorientierung Daten und Funktionen möglichst eng koppeln und nach außen kapseln Komplexität der Software besser modellieren

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

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

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

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

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

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

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

Vererbung. Was versteht man unter dem Begriff Vererbung?

Vererbung. Was versteht man unter dem Begriff Vererbung? Was versteht man unter dem Begriff Vererbung? Elternkonstrukt - Datenelemente - Methoden o Deklaration o Definition Kindkonstrukt... Main... Elternkonstrukt b = new Kindkonstrukt() b.fn() Komponenten &

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

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

Theorie zu Übung 8 Implementierung in Java

Theorie zu Übung 8 Implementierung in Java Universität Stuttgart Institut für Automatisierungstechnik und Softwaresysteme Prof. Dr.-Ing. M. Weyrich Theorie zu Übung 8 Implementierung in Java Klasse in Java Die Klasse wird durch das class-konzept

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

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

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

Ü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

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

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

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

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

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

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

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

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) Wintersemester 2006/07 Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich Informatik Lehrstuhl

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

Java, OO und UML Fortsetzung

Java, OO und UML Fortsetzung Java, OO und UML Fortsetzung Das Objektorientierte Paradigma OO bildet keine geschlossene theoretisch abgegrenzte Basis (wie z.b. das Relationsmodell relationaler Datenbanken) OO ist eine Sammlung 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

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

Prof. W. Henrich Seite 1

Prof. W. Henrich Seite 1 Klasse - ist ein benutzerdefinierter Datentyp (Referenztyp) - hat Datenelemente - hat Methoden - Konstruktor ist spezielle Methode zum Erstellen eines Objektes vom Typ der Klasse (Instanz) - jede Klasse

Mehr

Vererbung und Polymorphie

Vererbung und Polymorphie Vererbung und Polymorphie WiMa-Praktikum 1, Teil C++, Tag 5 Christoph Ott, Büro: Helmholtzstr.18, E22 Tel.: 50-23575, Mail: christoph.ott@uni-ulm.de Institut für Angewandte Informationsverarbeitung 29.08.08

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

5.5.8 Öffentliche und private Eigenschaften

5.5.8 Öffentliche und private Eigenschaften 5.5.8 Öffentliche und private Eigenschaften Schnittstellen vs. Implementierungen: Schnittstelle einer Klasse beschreibt, was eine Klasse leistet und wie sie benutzt werden kann, ohne dass ihre Implementierung

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

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

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

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

Informationsverarbeitung im Bauwesen

Informationsverarbeitung im Bauwesen 1/21 Informationsverarbeitung im Bauwesen Einführung in das Programmieren mit C++ Markus Uhlmann Institut für Hydromechanik Karlsruher Institut für Technologie www.ifh.kit.edu WS 2010/2011 Vorlesung 8

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

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

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

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

Inhaltsüberblick. I. Grundbegriffe - Objekte und Klassen. Organisatorisches. I. Grundbegriffe - Objektorientierte Konzepte

Inhaltsüberblick. I. Grundbegriffe - Objekte und Klassen. Organisatorisches. I. Grundbegriffe - Objektorientierte Konzepte Grundkonzepte Objektorientierter Programmierung Nicole Himmerlich FSU Jena mit Java, Oberon-2, Object-Pascal und Python Inhaltsüberblick I. Grundbegriffe 1) Kopplung 2) Datenkaspelung 3) Konstruktor 4)

Mehr

Java I Vorlesung Vererbung und Sichtbarkeit

Java I Vorlesung Vererbung und Sichtbarkeit Java I Vorlesung 4 Vererbung und Sichtbarkeit 17.5.2004 Vererbung Überladen, Überschreiben, Verstecken, Verschatten Zugriffskontrolle Statische Members Wiederholung: OOP Programme bestehen aus Klassen.

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

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

Vererbung. Vererbung von Methoden und Instanzvariablen. Vererbung als Realisierung einer is-a Beziehung.

Vererbung. Vererbung von Methoden und Instanzvariablen. Vererbung als Realisierung einer is-a Beziehung. Vererbung Unterklassen einer Klasse Vererbung von Methoden und Instanzvariablen Überschreiben von Methoden Vererbung als Realisierung einer is-a Beziehung. Informatik II: Objektorientierte SW-Entwicklung,

Mehr

Kurzeinführung in C/C++ Elementare Datentypen in C++

Kurzeinführung in C/C++ Elementare Datentypen in C++ Elementare Datentypen in C++ Anders als in Java sind in C++ die Größen der Elementaren Datentypen maschinenabhängig Die Größe der Datentypen lässt sich mit sizeof ermitteln: int n=sizeof(int) In C++ gilt

Mehr

Letztes Mal. static int ggt(int a, int b) { if (a == b) return a; else if (a > b) return ggt(a-b,b); else if (a < b) return ggt(a,b-a);

Letztes Mal. static int ggt(int a, int b) { if (a == b) return a; else if (a > b) return ggt(a-b,b); else if (a < b) return ggt(a,b-a); Letztes Mal static int ggt(int a, int b) { if (a == b) return a; else if (a > b) } return ggt(a-b,b); else if (a < b) return ggt(a,b-a); Darf hier nicht stehen! Compiler sagt: Missing return statement

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

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

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

Abend 7 Vererbung und Polymorphie, Abstrakte Klassen

Abend 7 Vererbung und Polymorphie, Abstrakte Klassen Abend 7 Vererbung und Polymorphie, Abstrakte Klassen Ziel, Inhalt Wir sehen heute weitere Beispiele für Polymorphie und virtuelle Methoden. Wir lernen auch Klassen kennen, von denen man keine Objekte erzeugen

Mehr

Objektorientierte Programmierung Teil 1: Einführung

Objektorientierte Programmierung Teil 1: Einführung Objektorientierte Programmierung Teil 1: Einführung Prof. Dr. Schoop FHT Esslingen, Sommersemester 2005 Agenda Beispielszenario Eigenschaften des objektorientierten Ansatzes Konzepte des objektorientierten

Mehr

Seminar Softwarereengineering/Merkmale der Programmiersprache C++

Seminar Softwarereengineering/Merkmale der Programmiersprache C++ Seminar Softwarereengineering/Merkmale der Programmiersprache C++ Martin Aumüller TU Ilmenau 31. Mai 2007 Themen 1 Generelle Probleme Kompatibilität mit C Standardisierung 2 Verständnisprobleme - Präprozessor

Mehr

VIII: Vererbung. Unterklassen einer Klasse. Vererbung von Methoden und Instanzvariablen. Überschreiben von Methoden

VIII: Vererbung. Unterklassen einer Klasse. Vererbung von Methoden und Instanzvariablen. Überschreiben von Methoden VIII: Vererbung Unterklassen einer Klasse Vererbung von Methoden und Instanzvariablen Überschreiben von Methoden Vererbung als Realisierung einer is-a Beziehung. Informatik I VIII: Vererbung 259 Beispiel:

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

Programmieren II Vererbung. Programmieren II Vererbung. Programmieren II Vererbung. Programmieren II Vererbung. Einleitende Bemerkungen

Programmieren II Vererbung. Programmieren II Vererbung. Programmieren II Vererbung. Programmieren II Vererbung. Einleitende Bemerkungen Einleitende Bemerkungen Einleitende Bemerkungen Ideen hinter der objektorientierten Programmierung Objekte (/* Instanzen einer Klasse */) im Mittelpunkt Objekte bilden Einheit aus Daten (/* Attributen,

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

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

SWE1 / Übung 9 (11.01.2012)

SWE1 / Übung 9 (11.01.2012) SWE1 / Übung 9 (11.01.2012) Vererbung Zugriffskontrolle Motivation für Vererbung (1) Objekte in der realen Welt kommen oft in ähnlichen Varianten (Attribute, Verhalten) vor Gliederung durch hierarchische

Mehr

Java - Programmierung - Objektorientierte Programmierung 1

Java - Programmierung - Objektorientierte Programmierung 1 Java - Programmierung - Objektorientierte Programmierung 1 // Klassen und Objekte public class KlaObj public static void main(string args []) Klasse1 a; a = new Klasse1("heute", 47); Klasse1 b = new Klasse1

Mehr

Objektorientierte Programmierung mit Java. Grundlagen Übersicht. Programmiersprachen

Objektorientierte Programmierung mit Java. Grundlagen Übersicht. Programmiersprachen Objektorientierte Programmierung mit Grundlagen 27.10.2008 1 Übersicht 27.10.2008 2 1 Übersicht Klassen und Objekte in - Klassen - Objekte - Klassen - Objekte 27.10.2008 3 Übersicht 27.10.2008 4 2 Einführung

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

Einführung in die Informatik

Einführung in die Informatik Einführung in die Informatik Jochen Hoenicke Software Engineering Albert-Ludwigs-University Freiburg Sommersemester 2014 Jochen Hoenicke (Software Engineering) Einführung in die Informatik Sommersemester

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

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

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

Einführung in die. objektorientierte Programmierung

Einführung in die. objektorientierte Programmierung Einführung in die objektorientierte Programmierung Teil 3 Vererbung Modul WI111: Objektorientierte Programmierung Fachrichtung Wirtschaftsinformatik Prof. Dr. Gert Faustmann Fachbereich Berufsakademie

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

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

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

Teil 2: OOP und JAVA (Vorlesung 11)

Teil 2: OOP und JAVA (Vorlesung 11) Teil 2: OOP und JAVA (Vorlesung 11) Modul: Programmierung B-PRG Grundlagen der Programmierung II Prof. Dot.-Ing. Roberto Zicari Professur für Datenbanken und Informationssysteme (FB 12) 28.06.06 1 Teil

Mehr

Programmierkurs Java. Vererbung. Prof. Dr. Stefan Fischer Institut für Telematik, Universität zu Lübeck http://www.itm.uni-luebeck.

Programmierkurs Java. Vererbung. Prof. Dr. Stefan Fischer Institut für Telematik, Universität zu Lübeck http://www.itm.uni-luebeck. Programmierkurs Java Vererbung Prof. Dr. Stefan Fischer Institut für Telematik, Universität zu Lübeck http://www.itm.uni-luebeck.de/people/fischer Ähnlichkeiten zwischen Klassen? Beispiel: Klassen Auto

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

Java - Vererbung. Personen. Leibniz Universität IT Services Anja Aue

Java - Vererbung. Personen. Leibniz Universität IT Services Anja Aue Java - Vererbung Personen Kunden Mitarbeiter Verwaltung Verkäufer Leibniz Universität IT Services Anja Aue Vererbung Definition von Klassen auf Basis von bestehenden Klassen. Eltern-Kind-Beziehung. Ableitung

Mehr

Informatik II Prüfungsvorbereitungskurs

Informatik II Prüfungsvorbereitungskurs Informatik II Prüfungsvorbereitungskurs Tag 2, 21.6.2016 Giuseppe Accaputo g@accaputo.ch 1 Themenübersicht 20.3: Java 21.3: Objektorientierte Programmierung 22.3: Dynamische Datenstrukturen 23.3: Datenbanksysteme

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

Programmieren II Klassen. Programmieren II Klassen. Programmieren II Klassen. Programmieren II Klassen. Zur Erinnerung.

Programmieren II Klassen. Programmieren II Klassen. Programmieren II Klassen. Programmieren II Klassen. Zur Erinnerung. Vorbemerkungen Zur Erinnerung aktueller Standpunkt: Entwickler von (bibliotheken) jetzt sind wichtig interne Repräsentation der Daten Realisierung der gewünschten Funktionalität Bereitstellung geeigneter

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

Vorlesung Programmieren. Bisher: Klassen und Objekte. Was ist mit ähnlichen Klassen? Vererbung und Polymorphismus

Vorlesung Programmieren. Bisher: Klassen und Objekte. Was ist mit ähnlichen Klassen? Vererbung und Polymorphismus Vorlesung Programmieren Vererbung und Polymorphismus Prof. Dr. Stefan Fischer Institut für Telematik, Universität zu Lübeck http://www.itm.uni-luebeck.de/people/fischer Bisher: Klassen und Objekte Haupteigenschaften:

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

2. Vererbung und Polymorphie. Vererbung (1/2) Beispiel (1/2) Vererbung (2/2) Eine Unterklasse wird folgendermaßen definiert

2. Vererbung und Polymorphie. Vererbung (1/2) Beispiel (1/2) Vererbung (2/2) Eine Unterklasse wird folgendermaßen definiert 2. Vererbung und Polymorphie Vererbung (1/2) Vererbung mit extends Konstruktoren bei der Vererbung Überladen von Methoden - statische Polymorphie Casten Dynamische Polymorphie Klasse Object Eine Unterklasse

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

Objekt-Orientierte Programmierung

Objekt-Orientierte Programmierung Objekt-Orientierte Programmierung Ein OO-Programm modelliert eine Anwendung als eine Welt von Objekten, die miteinander in Beziehung stehen ( später). Ein Objekt kann andere Objekte erzeugen. Ein Objekt

Mehr

Wiederholung zur Vorlesung Programmieren

Wiederholung zur Vorlesung Programmieren Wiederholung zur Vorlesung Jan 2007 Wintersemester 2007/2008 Computerlinguistik, Campus DU Einstieg Erläutern sie in knappen Worten die notwendigen Schritte um ein einfaches Java-Programm zu schreiben

Mehr

Klassen mit Instanzmethoden

Klassen mit Instanzmethoden Klassen mit Instanzmethoden Gerd Bohlender Institut für Angewandte und Numerische Mathematik Vorlesung: Einstieg in die Informatik mit Java 3.12.07 G. Bohlender (IANM UNI Karlsruhe) OOP und Klassen 3.12.07

Mehr

Java Einführung Abstrakte Klassen und Interfaces

Java Einführung Abstrakte Klassen und Interfaces Java Einführung Abstrakte Klassen und Interfaces Interface Interface bieten in Java ist die Möglichkeit, einheitliche Schnittstelle für Klassen zu definieren, die später oder/und durch andere Programmierer

Mehr

Teil 9: Vererbung. Prof. Dr. Herbert Fischer Fachhochschule Deggendorf Prof. Dr. Manfred Beham Fachhochschule Amberg-Weiden

Teil 9: Vererbung. Prof. Dr. Herbert Fischer Fachhochschule Deggendorf Prof. Dr. Manfred Beham Fachhochschule Amberg-Weiden Teil 9: Vererbung Prof. Dr. Herbert Fischer Fachhochschule Deggendorf Prof. Dr. Manfred Beham Fachhochschule Amberg-Weiden Inhaltsverzeichnis 9 Vererbung... 3 9.1 Motivation... 3 9.2 Deklaration und Zugriffsrechte...

Mehr

Übersicht. Vorstellung des OO-Paradigmas

Übersicht. Vorstellung des OO-Paradigmas Java, OO und UML Vorstellung des OO-Paradigmas Übersicht Umsetzung des OO-Paradigmas in Java Einführung (seeeeeehr rudimenter) in UML zur graphischen Darstellung von OO Grammatik und Semantik von Java

Mehr

Vererbung. Informatik B Objektorientierte Programmierung in Java. Vorlesung 03: Objektorientierte Programmierung (Teil 3) Vererbung.

Vererbung. Informatik B Objektorientierte Programmierung in Java. Vorlesung 03: Objektorientierte Programmierung (Teil 3) Vererbung. Universität Osnabrück 1 3 Objektorientierte Programmierung in Java Vorlesung 03: Objektorientierte Programmierung (Teil 3) Eines der wichtigsten Designmerkmale objektorientierter Sprachen ist die Zusammenfassung

Mehr

OOP III Auf den Grund gegangen (fast)

OOP III Auf den Grund gegangen (fast) OOP III Auf den Grund gegangen (fast) Vorüberlegungen und -arbeiten Eigenschaften = Instanzvariablen Größe Geschlecht class Vogel Fähigkeiten = Methoden: fortpflanzen fressen Eine Klasse Vogel soll definiert

Mehr

Klausur zu Objektorientierter Softwareentwicklung in C++ 4. Februar 2003 (WS 2002/2003) Beispiellösung

Klausur zu Objektorientierter Softwareentwicklung in C++ 4. Februar 2003 (WS 2002/2003) Beispiellösung Klausur zu Objektorientierter Softwareentwicklung in C++ 4. Februar 2003 (WS 2002/2003) Beispiellösung Bearbeitungszeit: 120 Minuten NICHT MIT BLEISTIFT SCHREIBEN!!! Name: Vorname: Matrikelnummer: Aufgabe

Mehr