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

Größe: px
Ab Seite anzeigen:

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

Transkript

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

2 Inhaltsverzeichnis 9 Vererbung Motivation Deklaration und Zugriffsrechte Initialisierung Konstruktoren und Destruktoren Initialisierung durch Kopie Polymorphismus Standardkonversionen bei abgeleiteten Klassen Virtuelle Funktionen "pure virtual"-funktionen und abstrakte Klassen Komplexes Programmbeispiel zum Einsatz von Vererbung Zusammenfassung Prof. Dr. Manfred Beham, FH Amberg-Weiden Seite 2

3 9 Vererbung Wir kennen bereits den Begriff der Vererbung in der objektorientierten Softwareentwicklung. Mit Hilfe der Vererbung können wir einmal erstellte Programmteile wiederverwenden, indem wir die Elemente einer Klasse an andere Klassen weiterreichen. Damit muss nicht in jeder Klasse das Rad neu erfunden werden. Wenn wir allgemeingültige Konzepte in unseren Objekten erkennen, sollten wir diese auch nur einmalig in sogenannten Basisklassen realisieren. Wir werden in diesem Kapitel die C++ Mechanismen zur Vererbung kennen lernen und beispielhaft einsetzen. Wir werden folgende Fragen beantworten: Wie vererbt man die allgemeinen Eigenschaften eines Kontos an spezialisierte Konten? Was bedeutet der Begriff Polymorphismus und in diesem Zusammenhang virtual? Was ist eine abstrakte Klasse? 9.1 Motivation Aus Gründen einer wirtschaftlich effizienten Programmentwicklung und höherer Softwarequalität fordert die Softwareindustrie von ihren Programmen oder Programmteilen: Wiederverwendung, Möglichkeiten zur Anpassung und Erweiterung. Deshalb ermöglicht die OO Softwareentwicklung, sogenannte Klassenhierarchien zu erstellen. Diese Hierarchie entsteht dadurch, dass neue Klassen gebildet werden, indem auf schon vorhandene, allgemeinere Klassendeklarationen mit Hilfe der Vererbung oder Ableitung zurückgegriffen wird. Ein Beispiel, bei dem Vererbung vorteilhaft eingesetzt werden kann, sind die verschiedenartigen Bankkonten. Wir haben es mit Girokonten, Sparkonten, Aktiendepots, Cashkonten um nur einige zu nennen zu tun. Alle diese verschiedenartigen Konten haben etwas gemeinsam. Diese Gemeinsamkeit modellieren wir in einer generellen Kontoklasse und bezeichnen diese Klasse auch als Basisklasse. Mit Hilfe der Vererbung wollen wir diese allgemeinen Eigenschaften eines Kontos in spezielleren Kontoklassen wiederverwenden. Dadurch spart man eine Menge Arbeit, da grundlegende Attribute und Methoden, die für alle Konten gelten, nur einmalig entwickelt und getestet werden müssen. Dieses Vorgehen vermeidet auch Fehler, die beim mehrmaligen entwickeln gleicher Funktionalität entstehen können. Prof. Dr. Manfred Beham, FH Amberg-Weiden Seite 3

4 Im Klassendiagramm werden die Beziehung zwischen der Basisklasse und den abgeleiteten Klassen durch Pfeile dargestellt. Die Pfeilspitze zeigt dabei in Richtung der Generalisierung. In der anderen Richtung haben wir demnach eine Spezialisierung. In den speziellen Konten müssen wir dann nur noch die Spezialitäten des jeweiligen Kontos realisieren. Also z.b. für das Girokonto: eine Geheimnummer,... und eine Methode prüft, die die eingegebene Nummer mit der Geheimnummer des Kontos vergleicht. Oder für das Sparkonto: eine Sperrfrist,... Durch die Vererbung wird sichergestellt, dass die Attribute und Methoden der Basisklasse auch in den abgeleiteten Klassen verfügbar sind wir sagen auch Attribute und Methoden werden vererbt. Die Beziehung zwischen abgeleiteter Klasse und Basisklasse lässt sich lesen mit ist ein. Also z.b. Girokonto ist ein Konto; ebenso wie Cashkonto ist ein Konto oder Sparkonto ist ein Konto. Wann sollte eine Klasse durch Vererbung gebildet werden? Eine Klasse ergibt sich als Spezialisierung oder Erweiterung einer vorhandenen (Girokonto). Eine Klasse vereint die Eigenschaften mehrerer vorhandener Klassen (Mehrfachvererbung). Zwei parallel entwickelte Klassen enthalten einen gemeinsamen Kern, der als Basisklasse verwendet werden kann. Vorteile: Die abgeleitete (neue) Klasse (Unterklasse, Kindklasse) erbt (fast) alle Eigenschaften - Attribute - Methoden von den bestehenden Klassen (Basisklassen, Oberklassen, Elternklassen), ohne daß diese angetastet oder neu übersetzt werden müssen. Diese Eigenschaften können in der abgeleiteten Klasse ergänzt oder auch verändert werden: - weitere Methoden oder Attribute hinzufügen - Methoden modifizieren Verschiedene Klassen in einer Hierarchie können eine gemeinsame, einheitliche Schnittstelle haben, was den Umgang mit Objekten dieser Klasse vereinfacht. Einschränkungen: Nicht vererbt werden: - Freundschaft mit einer anderen Klasse friend - Ein klassenspezifischer Zuweisungsoperator operator=() - Konstruktoren und Destruktoren 9.2 Deklaration und Zugriffsrechte Allgemeine C++ Syntax um eine Klasse abzuleiten: class AbgelKlasse : [virtual][private public protected] BasisKlasse, // Deklarationen für AbgelKlasse... Prof. Dr. Manfred Beham, FH Amberg-Weiden Seite 4

5 Der Name der abgeleiteten Klasse wird durch : vom Namen der Basisklasse(n) getrennt. Zugriffsrechte nach der Ableitung: Grundsätzlich erbt AbgelKlasse alle Komponenten von BasisKlasse, d.h. jede Instanz von AbgelKlasse enthält ein (anonymes) Objekt vom Typ BasisKlasse. Dieses Subobjekt wird noch vor den zusätzlichen Komponenten von AbgelKlasse durch impliziten Aufruf des Basisklassenkonstruktors erzeugt. Das Zugriffsrecht in der BasisKlasse und der Zugriffsmodifizierer (z.b. public oder private) bei der Ableitung bestimmen das Zugriffsrecht auf Komponenten von BasisKlasse in AbgelKlasse. private-komponenten von BasisKlasse sind in AbgelKlasse grundsätzlich nicht zugänglich. Ein Zugriff ist hier weiterhin nur über öffentliche Methoden von BasisKlasse möglich. Durch Ableitung von einer Klasse, kann man sich also nicht den Zugriff auf private Elemente erschleichen. public-ableitung: class AbgelKlasse : public BasisKlasse protected-komponenten von BasisKlasse sind auch in AbgelKlasse zugänglich jedoch nicht allgemein. public-komponenten der BasisKlasse sind auch in AbgelKlasse public. protected-ableitung: class AbgelKlasse : protected BasisKlasse public-komponenten von BasisKlasse werden zu protected-komponenten von AbgelKlasse. Auf sie kann von "außerhalb" nicht mehr zugegriffen werden. private-ableitung: class AbgelKlasse : [private] BasisKlasse Alle public- und protected-komponenten von BasisKlasse sind in AbgelKlasse private. Diese Form wird dann eingesetzt, wenn eine neue Schnittstelle in AbgelKlasse entstehen soll, d.h. die Implementierung wird vererbt (modelliert nicht "ist ein" sondern "ist implementiert durch"). Beachte: Es gilt immer das restriktivere Zugriffsrecht! Prof. Dr. Manfred Beham, FH Amberg-Weiden Seite 5

6 Tip: In der Definition von AbgelKlasse läßt sich das Zugriffsrecht einzelner Komponenten von BasisKlasse gezielt beeinflussen: class AbgelKlasse : <mod> BasisKlasse... [private public protected]: BasisKlasse::KomponentenName; // alte using BasisKlasse::KomponentenName; // neue Schreibw.... Beispiel: class AbgelKlasse : BasisKlasse... public: Basisklasse::Attribut ;... //defaultmäßig private abgeleitet //Attribut ist nun wieder public 9.3 Initialisierung Wenn wir nun ein Objekt einer abgeleiteten Klasse also z.b. Girokonto anlegen, stellt sich die Frage, wie werden dabei die ererbten Attribute der Klasse Konto initialisiert. Dazu gibt es genaue Regeln für die Konstruktoren abgeleiteter Klassen Konstruktoren und Destruktoren In einem Test wollen wir den Aufruf der Konstruktoren und Destructoren durch eingebaute Ausgaben während des Programmlaufs sichtbar machen: class Konto private: int KtoNr; //... public: // Defaultkonstruktor Konto () : KtoNr(999) cout << "Konto(), KtoNr: " << KtoNr << endl; // Parameterkonstruktor Konto (int knr) : KtoNr(kNr) cout << "Konto(int), KtoNr: " << KtoNr << endl; // Destruktor ~Konto() Prof. Dr. Manfred Beham, FH Amberg-Weiden Seite 6

7 cout << "~Konto(), KtoNr: " << KtoNr << endl; class Girokonto : public Konto private: float Dispo; //... public: Girokonto () : Dispo(2000) cout << "- Girokonto(), Disp.: " << Dispo << endl; Girokonto (float d) : Dispo(d) cout << "- Girokonto(float), Disp.: " << Dispo << endl; Girokonto (int knr, float d) : Konto(kNr), Dispo(d) cout << "- Girokonto(int,float), Disp.: " << Dispo << endl; ~Girokonto () cout << "- ~Girokonto(), Disp.: " << Dispo << endl; void main() Girokonto a, b(5500.0), c(123,1000.0); Ausgabe: Konto(), KtoNr: Girokonto(), Disp.: 2000 Konto(), KtoNr: Girokonto(float), Disp.: 5500 Konto(int), KtoNr: Girokonto(int,float), Disp.: ~Girokonto(), Disp.: 1000 ~Konto(), KtoNr: ~Girokonto(), Disp.: 5500 ~Konto(), KtoNr: ~Girokonto(), Disp.: 2000 ~Konto(), KtoNr: 999 Press any key to continue Erkenntnisse: Komponenten von Basisklassen können nur über ihre Konstruktoren initialisiert werden. Der Konstruktoraufruf erfolgt entweder implizit: Defaultkonstruktor (falls vorhanden) oder muß explizit erfolgen: in der Initialisierungsliste Ein expliziter Konstruktoraufruf muß erfolgen, wenn Parameter übergeben werden sollen. Die Parameter müssen bei der Definition der abgeleiteten Klasse in der Initialisierungsliste unter dem Namen der Klasse angegeben werden. Girokonto (int knr, float d) : Konto(kNr), Dispo(d) Prof. Dr. Manfred Beham, FH Amberg-Weiden Seite 7

8 Eine direkte Initialisierung ohne Konstruktoraufruf geerbter Attribute über die Initialisierungsliste ist nicht möglich! Reihenfolge der Konstruktion: Basisklassen in der Reihenfolge ihrer Deklaration in der Ableitungsliste (nicht in der Initialisierungsliste), danach die Member der abgeleiteten Klasse in der Reihenfolge ihrer Deklaration. Reihenfolge der Destruktion: genau umgekehrt Initialisierung durch Kopie Für das Verständnis dieses Abschnitts ist der Begriff des Copy-Konstruktors nötig, der erst in der nächsten Folge (Folge 10, Überladen von Operatoren) vollständig eingeführt wird. Ein Copy-Konstruktor ist immer dann nötig, falls ein Objekt einer abgeleiteten Klasse durch Kopie initialisiert wird, z.b. in der Form void main() Girokonto Objekt1(123,2000.0); Girokonto Objekt2 = Objekt1;... so lassen sich vier Fälle unterscheiden: 1. Die Basisklasse und die abgeleitete Klasse definieren keinen Copy-Konstruktor (siehe Folge 10): Es erfolgt eine elementweise Kopie der Komponenten von Objekt1 nach Objekt2 über die standardmäßig zur Verfügung gestellten Copy-Konstruktoren (Basisklassenanteil zuerst). 2. Für die Basisklasse wurde ein Copy-Konstruktor definiert, für die abgeleitete Klasse jedoch nicht. Konto(const Konto & rbobjekt) : KtoNr(rBObjekt.KtoNr) Der Basisklassenanteil wird automatisch durch den Copy-Konstruktor der Basisklasse initialisiert. Weitere Member des abgel. Objektes werden durch elementweise Kopie initialisiert. 3. Die abgeleitete Klasse definiert einen Copy-Konstruktor, die Basisklasse jedoch nicht. a) Girokonto(const Girokonto & rgobjekt) : Dispo(rGObjekt.Dispo) Für den Basisklassenanteil wird der Standardkonstruktor aufgerufen. b) Girokonto(const Girokonto & rgobjekt) : Konto(rGObjekt) Dispo(rGObjekt.Dispo) Der Basisklassenanteil wird durch elementweise Kopie initialisiert. Die Member des abgeleiteten Objektes werden durch den angegeben Copy-Konstruktor initialisiert. 4. Beide Klassen definieren Copy-Konstruktoren. Auch hier ist der Copy-Konstruktor der Basisklasse explizit im Copy-Konstruktor der abgeleiteten Klasse aufzurufen (Fall 3b). Prof. Dr. Manfred Beham, FH Amberg-Weiden Seite 8

9 9.4 Polymorphismus Manchmal ist es sinnvoll, wenn sich eine bestimmte Methode einer Klasse unterschiedlich verhält, je nachdem in welchem Zusammenhang unsere Klasse eingesetzt wird. Es ist möglich, dass die Methode einer Klasse höchst unterschiedliche Ergebnisse produziert und damit die Vielgestaltigkeit also den Polymorphismus der Klasse hervorruft. Eine Klasse, die Methoden dieser Art besitzt, bezeichnen wir als polymorphe Klasse. Ein sinnvolles Beispiel für eine derartige Methode wäre das Drucken eines Kontoauszugs. Betrachten wir dazu nochmals unser Klassendiagramm mit den verschiedenen Kontotypen und überlegen uns, wie ein Kontoauszug gedruckt werden könnte. Sicher soll der Ausdruck für ein Sparkonto andere Details beinhalten als der Ausdruck für ein Girokonto. Wir werden also allen unseren Kontotypen eine eigene, spezielle Methode print spendieren. Auch für die Basisklasse Konto wäre eine Methode print denkbar: Konto::print class Konto public: //... void print () const cout << "KtoNr: " << KtoNr << endl; cout << "Stand: " << Stand << endl << endl; Girokonto::print #include konto.h class Girokonto : public Konto public: //... void print () const cout << "Giro KtoNr: " << getktonr() << endl; cout << "Stand: " << getstand() << endl; cout << "Dispo: " << Dispo << endl << endl; Datei: main.cpp #include girokonto.h int main () Konto * kp = new Konto(111); GiroKonto * gp = new Girokonto(222); kp->print(); gp->print(); return 0; Prof. Dr. Manfred Beham, FH Amberg-Weiden Seite 9

10 Frage: Was gibt dieses Beispielprogramm aus? KtoNr: 111 Stand: 0.0 Giro KtoNr: 222 Stand: 0.0 Dispo: Das war zu erwarten. Für ein Objekt vom Typ Konto wird auch die Methode Konto::print und für ein Girokonto Girokonto::print aufgerufen. Der Typ eines Objekts entscheidet also, welche Methode aufzurufen ist. Das gilt auch für Zeigervariablen, denn auch sie haben einen Typ, nämlich den Typ des Objekts, auf das sie verweisen. Deshalb kann bereits der Compiler bei der Erstellung des Programms entscheiden, welche Methode aufzurufen ist. Wir bezeichnen diesen Vorgang auch als statisches Binden Standardkonversionen bei abgeleiteten Klassen Die Verhältnisse werden etwas unübersichtlicher, wenn wir den Typ eines Zeigers in einen anderen Typ wandeln. Normalerweise kann der Typ eines Objekts nicht einfach geändert werden. Wir können deshalb nicht einfach einer Variablen vom Typ Girokonto ein Sparkonto zuweisen. Ein Girokonto ist andersartig als Objekte vom Typ der Klasse Sparkonto. Schließlich fehlen dem Sparkonto wichtige Attribute, die nur Girokonto besitzt. Wenn wir mit abgeleiteten Klassen arbeiten, ist aber unter bestimmten Umständen eine Typkonvertierung möglich. Und zwar kann eine spezielle Klasse auf die generelle Klasse konvertiert werden. Implizite Typkonvertierung: Beachte: Ein Objekt, ein Zeiger oder eine Referenz einer abgeleiteten Klasse kann einem Objekt, einem Zeiger oder einer Referenz seiner Basisklasse zugewiesen werden. Dabei findet eine implizite Typkonvertierung statt (gilt nicht umgekehrt). Bei Objekten gehen die zusätzlichen Daten der abgeleiteten Klasse verloren, der Basisklassenanteil wird kopiert. In folgendem Beispiel legen wir ein Objekt vom Typ Girokonto an und weisen den Zeiger auf dieses Objekt einer Variablen vom Typ Zeiger auf Konto zu. Also eigentlich zwei unterschiedliche Klassen, aber diese Umwandlung ist möglich., weil Girokonto ist ein Konto. Und deshalb darf auch ein Konto-Zeiger auf ein Girokonto verweisen. Wir haben also gar keine Konvertierung des Objekts selbst vorgenommen, sondern lediglich einen andersartigen Verweis auf das Objekt Girokonto. Beispiel: main1.cpp #include girokonto.h int main () GiroKonto * gp = new Girokonto(222); Konto * kp = gp; // implizite Typkonvertierung: Girokonto zu Konto kp->print(); Prof. Dr. Manfred Beham, FH Amberg-Weiden Seite 10

11 return 0; Frage: Was gibt dieses Beispielprogramm aus? KtoNr: 222 Stand: 0.0 Das ist eigentlich nicht überraschend. Die Regel, dass der Datentyp des Objekts die zugehörige Methode bestimmt gilt auch hier. Also ein Zeiger auf Konto => Methode Konto::print von Konto. Beachte: Der statische Zeigertyp bestimmt die aufzurufende Methode! Dieses Verhalten ist aber nicht immer erwünscht. Wir hatten doch eigentlich in diesem Beispiel ein Objekt vom Typ Girokonto, es wird aber die Methode der Klasse Konto aufgerufen also ein allgemeiner nichtssagender Kontoauszug gedruckt. Dieses Verhalten können wir grundlegend ändern, wenn wir unsere print-methode virtuell deklarieren Virtuelle Funktionen Ziel: Verwendung "allgemeiner" Zeiger zur Verwaltung unterschiedlicher Objekte einer Klassenhierarchie, wobei die (in den abgeleiteten Klassen gleichnamigen) Methoden des Objektes angesprochen werden, auf das gerade gezeigt wird (Nicht der Zeigertyp bestimmt die Methode, sondern der Objekttyp!). Lösung: Um dies zu gewährleisten, müssen die relevanten (nicht statischen) Methoden zumindest in der Basisklasse mit dem Schlüsselwort virtual als dynamisch bindbar gekennzeichnet werden. Virtuelle print Methode class Konto //... wie gehabt virtual void print () const cout << "KtoNr: " << KtoNr << endl; cout << "Stand: " << Stand << endl << endl; Die einzige Veränderung an unserer Klasse Konto ist das Schlüsselwort virtual vor der Deklaration der Methode print(). Wir verwenden das Beispielprogramm main2.cpp aus vorigem Abschnitt unverändert und stellen uns die Frage: Was wird ausgegeben? Beispiel: #include girokonto.h Prof. Dr. Manfred Beham, FH Amberg-Weiden Seite 11

12 int main () GiroKonto * gp = new Girokonto(222); Konto * kp = gp; // implizite Typkonvertierung: Girokonto zu Konto kp->print(); return 0; Das ist jetzt etwas vollkommen neues. Der Typ der Zeigervariablen bestimmt nun nicht mehr die aufzurufende Methode, sondern der tatsächlich vorliegende Objekttyp entscheidet, welche Methode aufgerufen wird. Denn obwohl kp ein Zeiger auf Konto ist, wird die Methode Girokonto::print aufgerufen. Hier kann auch nicht mehr der Compiler bereits die Methodenauswahl treffen, sondern es muss zur Laufzeit des Programms, die richtige Methode gewählt werden. Wir bezeichnen diesen Vorgang im Gegensatz zum statischen Binden auch als late binding. Bei virtuellen Methoden können wir also noch nicht vorhersagen, welche Funktion tatsächlich ausgeführt wird. Das man das richtige Verhalten für die Methode print der Klasse Konto erhält unabhängig davon, welche Art von Konto man eigentlich benutzt, wird Polymorphismus genannt. Eine Klasse mit virtuellen Methoden wird polymorphe Klasse genannt. Um polymorphes Verhalten in C++ zu erzielen, müssen die aufgerufenen Methoden virtuell sein. Hinweise zur Verwendung von virtual: virtual darf nur innerhalb der Klassendefinition angegeben werden. virtual muß in der Basisklasse angegeben werden und sollte in den davon abgeleiteten Klassen wiederholt werden (virtual vererbt sich). Eine Klasse, in der eine virtuelle Methode vorhanden ist (durch Deklaration oder Vererbung), heißt auch polymorphe Klasse. Eine virtuelle Methode kann (sollte aber nicht) in einer abgeleiteten Klasse durch eine gleichnamige Methode mit unterschiedlichen Parametern überschrieben werden. In diesem Fall wird der "virtual- Mechanismus" nicht ausgelöst, die neue Methode überdeckt die virtuelle Methode. virtual wirkt nur, wenn die so gekennzeichnete Methode in der abgeleiteten Klasse exakt die gleiche Schnittstelle (Rückgabetyp + Signatur) besitzt. Ausnahme: Ist der Rückgabetyp eine Referenz oder ein Zeiger auf die Basisklasse, dann darf der Rückgabetyp in der abgeleiteten Klasse eine Referenz oder ein Zeiger auf die abgeleitete Klasse sein. Beachte: Eine als virtual deklarierte Methode in einer Basisklasse definiert explizit eine Schnittstelle für alle davon abgeleiteten Klassen. Nicht virtuelle Methoden sollten in abgeleiteten Klassen nicht überschrieben werden! Für besonders Interessierte: Der virtual Mechanismus Die Ermittlung der Adresse der virtuellen Funktion, die über einen Basisklassenzeiger aufgerufen wird, erfolgt erst zur Laufzeit. Das Schlüsselwort virtual bewirkt: Jedes Objekt einer polymorphen Klasse enthält zusätzlich einen Zeiger vptr, den virtual table pointer. Dieser zeigt auf eine Adresstabelle, in der Verweise auf alle dynamisch bindbaren Methoden der Klasse aufgenommen sind. Diese virtuelle Methodentabelle VMT oder virtual function table VFT wird für jede polymorphe Klasse in einer Hierarchie angelegt. Prof. Dr. Manfred Beham, FH Amberg-Weiden Seite 12

13 Wird für ein Objekt über einen Zeiger oder eine Referenz eine virtuelle Methode aufgerufen, so erfolgt dies indirekt über den vptr, der auf die zugehörigen Methoden des referenzierten Objektes verweist. Da nur ein existierendes Objekt über einen vptr verfügt, dürfen statische Methoden nicht virtual deklariert werden, da sie ja objektunabhängig existieren und aufgerufen werden können. Auch Konstruktoren können nicht virtual sein, da sie für "noch nicht" existierende Objekte aufgerufen werden. Beachte: Falls eine Klasse virtuelle Methoden deklariert, sollte auch der Destruktor als virtual deklariert werden "pure virtual"-funktionen und abstrakte Klassen Man kann in C++ noch einen Schritt weiter gehen und virtual deklarierte Funktionen in der Basisklasse gar nicht mehr realisieren. Wir bezeichnen eine lediglich deklarierte aber nicht definierte virtuelle Funktion als pure-virtual-function. In der Basisklasse wird dann nur noch ein Konzept festgelegt, d.h. eine Art Designvorschrift, in der angegeben wird, welche Methoden überlagert werden müssen und wie deren Schnittstelle auszusehen hat, dann braucht für diese Methoden auch keine Implementierung angegeben werden. Pure virtual print Methode: class Konto //... wie gehabt virtual void print () const = 0; // keine Implementierung in der Basisklass Von der Klasse Konto kann dann keine Instanz gebildet werden. Sie wird deshalb als abstrakte Klasse bezeichnet. Zeiger und Referenzen auf eine abstrakte Klasse können jedoch definiert werden. pure virtual functions werden vererbt. D.h. eine von einer abstrakten Klasse abgeleitete Klasse ist nur dann nicht mehr abstrakt, wenn sie für alle pure virtual functions eine Implementierung angibt. Eine abgeleitete Klasse kann durch eigene pur virtual functions erst zur abstrakten Klasse werden. Beachte: Abstrakte Klassen sollten ebenfalls mit einem virtuellen Destruktor ausgestattet werden Komplexes Programmbeispiel zum Einsatz von Vererbung Im folgenden Beispiel soll veranschaulicht werden, wie vorteilhaft Vererbung gerade bei großen Softwareprojekten eingesetzt werden kann, wenn mehrere Entwickler möglichst unabhängig voneinander ein Problem bearbeiten sollen. Polymorphismus ist deshalb ein wesentliches Element der OO- Softwareentwicklung. Wir wollen nochmals eine Liste von Konten entwickeln, aber diesmal von einem sehr weitblickenden Entwickler, und wir wollen versuchen, die Designentscheidungen dieses Entwicklers nachzuvollziehen. Zuerst einmal muss er natürlich berücksichtigen, das verschiedenartige Konten in einer Liste aufgenommen werden. Denn es gibt ja Girokonten, Sparkonten, etc. Ein sehr weitblickender Entwickler würde noch einen Prof. Dr. Manfred Beham, FH Amberg-Weiden Seite 13

14 Schritt weiter gehen und seine Liste nicht nur auf Konten beschränken. Er würde daher Listen von allen möglichen Objekten aufbauen also z.b. Adressen, Kundenkontakte, Transaktionen, usw. Der sehr weit blickende Entwickler würde sich also die Frage stellen, was haben alle Objekte gemeinsam, die in meine Liste aufgenommen werden sollen. Diese Gemeinsamkeit würde er dann Konzept nennen. Und er würde fordern: Alle Objekte, die in meine Liste wollen, müssen dieses Konzept realisieren. Ein Konzept wird in C++ durch eine Klasse beschrieben. Damit haben wir eine viel allgemeinere und meines Erachtens auch bessere Definition für die Klassen in C++: Eine Klasse beschreibt ein Konzept Die Klasse Element Wir nennen unser allgemeines Konzept für Objekte, die in eine Liste aufgenommen werden können, Element. Das wird auch der Name der Klasse. Wir überlegen uns zuerst nur, was sollen unsere Listenelemente können: Sich durch Ankoppeln an bestehende Elemente in einer Liste verketten: insert Einen Ausdruck erzeugen: print. Damit wollen wir einen Ausdruck der gesamten Liste ausgeben. Diese beiden Methoden beschreiben unser jetzt ein sehr allgemeines Konzept für unsere Klasse Element. Damit ergibt sich die Klassendefinition wie folgt: // Klasse für Listenelemente class Element friend class List; private: Element* next; // Verkettungszeiger public: Element () : next(0) virtual void print () const = 0; // pure virtual function protected: inline void insert (Element* e); Die reine Deklaration ist noch nicht sehr hilfreich, wir müssen die Methoden auch noch realisieren. Die Methode insert können wir bereits realisieren. Sie wissen, wir benötigen einen Verkettungszeiger, der ein wichtiger Bestandteil unseres Konzepts Listenelement ist. Das Ankoppeln erfolgt durch geeignete Veränderung der Verkettungszeiger: //... // Dieses Element nach einem Element an der Position pos ankoppeln void Element::insert (Element* pos) next = pos->next; pos->next = this; Prof. Dr. Manfred Beham, FH Amberg-Weiden Seite 14

15 Wie sollen wir aber die Methode print realisieren, wenn wir noch gar nicht wissen können, welche Objekte jemals in unsere Liste eingefügt werden? Wir können diese Methode in unsrem allgemeinen Konzept gar nicht realisieren. Wir haben sie lediglich in unser Konzept aufgenommen, um zu fordern, dass alle Elemente, die in unsere Liste aufgenommen werden, diese Methode realisieren müssen. Deshalb deklarieren wir diese Methode virtuell. Damit ist sichergestellt, das die passende print-methode der Objekte aufgerufen wird, die später einmal in unserer Liste sind. Objekte unserer Klasse Element sind allerdings ziemlich sinnlos. Man kann sie zwar in einer Liste verketten; sie tragen aber keinerlei Information. Deshalb können wir auch die print Methode gar nicht realisieren und aus diesem Grund deklarieren wir sie einfach als pure virtual function, was durch das = 0 am Ende der Deklaration kenntlich gemacht wird. Pur virtuell bedeutet also, dass in der Basisklasse keine Realisierung dieser Funktion existiert. Eine Klasse, die pure virtual functions besitzt, wird zur abstrakten Klasse. Von einer abstrakten Klasse können keine Objekte angelegt werden. Sie dient vielmehr als Beschreibung für ein Konzept, das durch Vererbung in den abgeleiteten Klassen vervollständigt werden muss. Wir haben jetzt eine abstrakte Klasse definiert, die das grundlegende Konzept für alle möglichen Listenelemente festlegt. Die Klasse List Für unseren weitblickenden Programmierer bedeutet dies: Er kann bereits eine Liste programmieren, ohne zu wissen, welche Objekte jemals in dieser Liste aufgenommen werden. Andere Programmierer könnten diese Liste verwenden, um ihre eigenen Objekte darin zu speichern. Die Programmierer müssten sich gar nicht gegenseitig kennen, denn alles was sie von der Liste benötigen, ist das Konzept der Elemente: #include element.h // Liste mit Dummyelement für den Kopf der Liste class List private Element head; public: void insert (Element* ep) ep->insert (&head); void print () const Element *ep; for (ep = head.next; ep!= 0; ep = ep->next) ep->print (); //!!! Verwendung einer pure virtual Funktion Dieses Beispiel zeigt, wir können bereits die vollständige Listenklasse implementieren, obwohl wir noch gar nicht wissen, welche Elemente in die Liste eingefügt werden. Wir verwenden einfach ein abstraktes Konzept für die Elemente und können bereits die noch nicht definierten pure virtual Funktionen aufrufen. Funktionsfähig wird die Liste aber erst, sobald wir konkrete Klassen von unserem abstrakten Element Prof. Dr. Manfred Beham, FH Amberg-Weiden Seite 15

16 ableiten und in die Liste einfügen. Welche Klassen das sein werden, braucht uns hier noch nicht zu interessieren. Eine Liste von Konten Wenn wir unsere Konten also in einer Liste ablegen wollen, müssen wir die Klasse Konto von der Klasse Element ableiten und wir dürfen nicht vergessen die Methode print zu implementieren, denn sonst bleibt auch die Klasse Konto abstrakt und wir könnten keine Konten anlegen. Sie sehen hier den Quelltext der Klasse Konto. Sie wir public von Element abgeleitet und sie realisiert die virtuelle print Methode. Damit ist Konto keine abstrakte Klasse mehr und wir können Objekte vom Typ Konto anlegen: #include element.h // Konto (allgemein) class Konto : public Element private: int KtoNr; float Stand; public: virtual void print () const cout << KtoNr: << KtoNr <<, DM << Stand << endl;... // weitere Methoden Zusammenfassend können wir also sagen: Die Klasse Konto realisiert das Konzept Element. Damit können Objekte vom Typ Konto Bestandteil unserer Liste werden. Dazu ein Ausschnitt aus dem Hauptprogramm: #include konto.h #include list.h int main () List l; Konto* kp = new Konto (32168, 0.0); // füge Konto ein l.insert (kp); //... // gebe Liste aus l.print () //... Prof. Dr. Manfred Beham, FH Amberg-Weiden Seite 16

17 9.5 Zusammenfassung Nachfolgende Tabelle fasst die wesentlichen Eigenschaften von (speziellen) Memberfunktionen, Operatoren und friends bezüglich Vererbbarkeit und anderen Eigenschaften zusammen: Prof. Dr. Manfred Beham, FH Amberg-Weiden Seite 17

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

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

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

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

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

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

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

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

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

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

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

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

Objektorientierte Programmierung mit Python Polymorphismus und Vererbung. Eltern

Objektorientierte Programmierung mit Python Polymorphismus und Vererbung. Eltern Objektorientierte Programmierung mit Python Polymorphismus und Vererbung Eltern Kind Kind Kind Kind Prinzipien der objektorientierten Programmierung Vererbung Strukturierung von Klassen. Oberbegriffe beschreiben

Mehr

PIWIN I. Praktische Informatik für Wirtschaftsmathematiker, Ingenieure und Naturwissenschaftler I. Vorlesung 3 SWS WS 2008/2009

PIWIN I. Praktische Informatik für Wirtschaftsmathematiker, Ingenieure und Naturwissenschaftler I. Vorlesung 3 SWS WS 2008/2009 PIWIN I Kap. 8 Objektorientierte Programmierung - Vererbung 1 PIWIN I Praktische Informatik für Wirtschaftsmathematiker, Ingenieure und Naturwissenschaftler I Vorlesung 3 SWS WS 2008/2009 FB Informatik

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

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

C++ - Operatoren. Eigene Klassen mit neuen Funktionen

C++ - Operatoren. Eigene Klassen mit neuen Funktionen C++ - Operatoren Eigene Klassen mit neuen Funktionen Übersicht Klassen bisher Eigene Operatoren definieren 2 Bisher Durch Kapselung, Vererbung und Polymorphy können nun eigene Klassen definiert werden,

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

Objektorientierung: Klassen und Objekte

Objektorientierung: Klassen und Objekte Objektorientierung: Klassen und Objekte Klasse: Beschreibung für eine Menge von Objekten Schablone, Bauplan abstrakte Form Objekt: Instanz einer Klasse konkreter Inhalt (Werte) Klassen bestehen aus Attributen

Mehr

Objektorientiertes Programmieren für Ingenieure

Objektorientiertes Programmieren für Ingenieure Uwe Probst Objektorientiertes Programmieren für Ingenieure Anwendungen und Beispiele in C++ 18 2 Von C zu C++ 2.2.2 Referenzen und Funktionen Referenzen als Funktionsparameter Liefert eine Funktion einen

Mehr

Von der UML nach C++

Von der UML nach C++ 22 Von der UML nach C++ Dieses Kapitel behandelt die folgenden Themen: Vererbung Interfaces Assoziationen Multiplizität Aggregation Komposition Die Unified Modeling Language (UML) ist eine weit verbreitete

Mehr

OO Softwareentwicklung

OO Softwareentwicklung OO Softwareentwicklung Objektorientierung Prof. Dr. Bernhard Schiefer 1 OO als Ansatz zur Verbesserung der Software-Qualität Modellierung der Welt als selbständig agierende Objekte. Gemeinsame Beschreibung

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

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

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

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

Mehr

Programmieren 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

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

EINI I. Einführung in die Informatik für Naturwissenschaftler und Ingenieure. Vorlesung 2 SWS WS 10/11

EINI I. Einführung in die Informatik für Naturwissenschaftler und Ingenieure. Vorlesung 2 SWS WS 10/11 EINI I Einführung in die Informatik für Naturwissenschaftler und Ingenieure Vorlesung 2 SWS WS 10/11 Fakultät für Informatik Technische Universität Dortmund lars.hildebrand@udo.edu http://ls1-www.cs.uni-dortmund.de

Mehr

Objektorientierte Programmierung. Objektorientierte Programmierung. Klasse. Objekt. Beispiel: Sportfest1. Methode. Eine Einführung mit BlueJ

Objektorientierte Programmierung. Objektorientierte Programmierung. Klasse. Objekt. Beispiel: Sportfest1. Methode. Eine Einführung mit BlueJ Objektorientierte Programmierung Objektorientierte Programmierung Eine Einführung mit BlueJ stellt die Daten, ihre Struktur und ihre Beziehungen zueinander in den Vordergrund. Weniger im Blickpunkt: die

Mehr

Objektorientierte Programmierung

Objektorientierte Programmierung 1. Begriffe Objektorientierte Programmierung mit C++ Prozedurale Programmierung Sprachen: C, Pascal, Cobol, Basic,... Objektorientierte Programmierung Sprachen: C++, C#, Java... Methode: - Gesamtproblem

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

PIWIN 1 Übung Blatt 5

PIWIN 1 Übung Blatt 5 Fakultät für Informatik Wintersemester 2008 André Gronemeier, LS 2, OH 14 Raum 307, andre.gronemeier@cs.uni-dortmund.de PIWIN 1 Übung Blatt 5 Ausgabedatum: 19.12.2008 Übungen: 12.1.2009-22.1.2009 Abgabe:

Mehr

einkonto.zahle(+100); //Transaktion Einzahlung einkonto.zahle(-20); //Transaktion Auszahlung einkonto.zahle(+30); //Transaktion Einzahlung

einkonto.zahle(+100); //Transaktion Einzahlung einkonto.zahle(-20); //Transaktion Auszahlung einkonto.zahle(+30); //Transaktion Einzahlung PIWIN I Kap. 7 Objektorientierte Programmierung - Einführung 28 Testklasse public class TestGirokonto { public static void main(string[] args) { // erzeuge neues Konto Girokonto einkonto = new Girokonto();

Mehr

Alltagsnotizen eines Softwareentwicklers

Alltagsnotizen eines Softwareentwicklers Alltagsnotizen eines Softwareentwicklers Entkoppeln von Objekten durch Callbacks mit c++-interfaces oder boost.function und boost.bind Tags: c++, entkoppeln, objekt, oop, callback, boost.bind, boost.function,

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

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

Lösungen zu Übung 3 Objektorientierte Modellierung - Statisches Modell

Lösungen zu Übung 3 Objektorientierte Modellierung - Statisches Modell Universität Stuttgart Institut für Automatisierungs- und Softwaretechnik Prof. Dr.-Ing. Dr. h. c. P. Göhner Lösungen zu Übung 3 Objektorientierte Modellierung - Statisches Modell Aufgabe 3. Assoziation

Mehr

Java für Computerlinguisten

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

Mehr

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

PHP Aufbaukurs. Tag 3. PHP5 & Klassen

PHP Aufbaukurs. Tag 3. PHP5 & Klassen PHP Aufbaukurs Tag 3. PHP5 & Klassen Organisatorisches 2 Igor Olkhovskiy Dr. Dipl.- Ing. Kontakt: olkhovskiy@rrzn.uni-hannover.de PHP Aufbaukurs 19.09.2006 Folie 2 PHP. OOP. Geschichte 3 PHP/FI ( PHP 1

Mehr

Meeting C++ C++11 R-Value Referenzen

Meeting C++ C++11 R-Value Referenzen Meeting C++ Detlef Wilkening http://www.wilkening-online.de 09.11.2012 Inhalt Motivation L-Values und R-Values R-Value Referenzen Move Semantik std::move Funktionen mit R-Value-Referenz Parametern Fazit

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

Objektorientierung Grundbegriffe

Objektorientierung Grundbegriffe Objektorientierung Grundbegriffe Um Java programmieren zu können, ist es wichtig, einige objektorientierte Grundkenntnisse zu besitzen, denn die Sprache setzt voll auf dem OO-Paradigma auf. 3.1 Klassen

Mehr

C++ - Einführung in die Programmiersprache Objektorientierte Programmierung

C++ - Einführung in die Programmiersprache Objektorientierte Programmierung C++ - Einführung in die Programmiersprache Objektorientierte Programmierung hat Kanten hat eine Farbe hat eine Kantenfarbe Rechteck zeichnen Rechteck einfärben Rechteck drehen Modulare Programmierung Projekt

Mehr

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

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

Mehr

C vs. C++ Sebastian Meyer. Proseminar C - Grundlagen und Konzepte. Universität Hamburg

C vs. C++ Sebastian Meyer. Proseminar C - Grundlagen und Konzepte. Universität Hamburg C vs. C++ Sebastian Meyer Universität Hamburg Proseminar C - Grundlagen und Konzepte 2013 1 / 31 Gliederung 1 Einführung 2 Vergleich der Spracheigenschaften 3 Neue Sprachelemente in C++ 4 Fazit 5 Zusammenfassung

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 im Herbstwintersemester 2007. Autorisierte studentisch Lösungen zu Aufgabenblatt 2

Vorlesung im Herbstwintersemester 2007. Autorisierte studentisch Lösungen zu Aufgabenblatt 2 Praktische Informatik I Vorlesung im Herbstwintersemester 2007 Autorisierte studentisch Lösungen zu Aufgabenblatt 2 zusammengestellt von Iva Tsvetkova 9.10.2007 1.Präsenzaufgaben 1.1 Entwurf einer Verwaltung

Mehr

C++-Zusammenfassung. H. Schaudt. August 18, 2005

C++-Zusammenfassung. H. Schaudt. August 18, 2005 C++-Zusammenfassung H. Schaudt August 18, 2005 1 Datentypen 1.1 Grunddatentypen int (-32xxx bis +32xxx, implementerungs-abhängig) char -128 bis +128 float double bool (C++) int und char sind austauschbar:

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

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

11. Klassen. Prof. Dr. François E. Cellier Informatik I für D-ITET (HS 2012) 11. Klassen Prof. Dr. François E. Cellier Informatik I für D-ITET (HS 2012) Objektorientierte Programmierung Das Konzept der Klassen Members Objekte Konstruktoren und Destruktoren this-pointer Public und

Mehr

Übersicht. Informatik 2 Teil 3 Anwendungsbeispiel für objektorientierte Programmierung

Übersicht. Informatik 2 Teil 3 Anwendungsbeispiel für objektorientierte Programmierung Übersicht 3.1 Modell Konto 3.2 Modell Konto - Erläuterungen 3.3 Benutzer Ein- und Ausgabe mit Dialogfenster I 3.4 Benutzer Ein- und Ausgabe mit Dialogfenster II 3.5 Klassen- und Objekteigenschaften des

Mehr

Von Java/C nach C++ Fokus. Fabian Scheler, Peter Ulbrich, Niko Böhm. 21. Oktober 2008

Von Java/C nach C++ Fokus. Fabian Scheler, Peter Ulbrich, Niko Böhm. 21. Oktober 2008 Überblick 1 Primitive Datentypen Von Java/C nach Fabian Scheler, Peter Ulbrich, Niko Böhm Friedrich-Alexander-Universität Erlangen-Nürnberg Lehrstuhl Informatik 4 (Verteilte Systeme und Betriebssysteme)

Mehr

Javakurs 2013 Objektorientierung

Javakurs 2013 Objektorientierung Javakurs 2013 Objektorientierung Objektorientierte Programmierung I Armelle Vérité 7 März 2013 Technische Universität Berlin This work is licensed under the Creative Commons Attribution-ShareAlike 3.0

Mehr

1. Java ist... 2. Stammbaum der Programmiersprachen 3. Die "Softwarekrise"

1. Java ist... 2. Stammbaum der Programmiersprachen 3. Die Softwarekrise im Überblick im Überblick Inhalt 1. Java ist... 2. Stammbaum der Programmiersprachen 3. Die Softwarekrise 1. Merkmale von Software 2. Fortlaufende Veränderungen 3. Erschwerte Rahmenbedingungen bei der

Mehr

Inhalt: Version 1.7.5

Inhalt: Version 1.7.5 Inhalt: Objekte ohne Methoden Objekte mit einfachen Methoden Objekte und Methoden mit Parametern Objekte und Methoden mit Rückgabewert Objekte mit einem Array als Attribut Beziehungen zwischen Objekten

Mehr

Informatikpraktikum CE2. Übung 1: Einfach verkettete Liste

Informatikpraktikum CE2. Übung 1: Einfach verkettete Liste Informatikpraktikum CE2 Übung 1: Einfach verkettete Liste c Torben Nehmer 1998 INHALTSVERZEICHNIS INHALTSVERZEICHNIS Inhaltsverzeichnis 1 Anforderungen an die Liste 3 1.1 Beschreibung

Mehr

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek Programmieren I Dr. Klaus Höppner Hochschule Darmstadt Wintersemester 2008/2009 1 / 22 2 / 22 Strategie zum Entwurf von Klassen Beispiele Objektorientierte Sichtweise: Mit welchen Objekten habe ich es

Mehr

Angewandte Mathematik und Programmierung

Angewandte Mathematik und Programmierung Angewandte Mathematik und Programmierung Einführung in das Konzept der objektorientierten Anwendungen zu wissenschaftlichen Rechnens mit C++ und Matlab SS2013 Inhalt Bis jetzt: Heute: Entwicklungsumgebung

Mehr

Kapitel 3 Das Projekt Bankkonto Seite 1

Kapitel 3 Das Projekt Bankkonto Seite 1 Kapitel 3 Das Projekt Bankkonto Seite 1 3 Das Projekt Bankkonto Nun wirst du dich etwas gründlicher mit dem Quelltext einer Klasse beschäftigen. Du lernst, wie zwei Objekte eine gemeinsame Aufgabe erledigen.

Mehr

5 Projekt Bankverwaltung

5 Projekt Bankverwaltung Kapitel 5 Bankverwaltung (Lösung) Seite 1/7 5 Projekt Bankverwaltung 5.1 Festlegen der Schnittstelle Bevor du mit der Programmierung beginnst, musst du dir einige Gedanken über die Schnittstelle zwischen

Mehr

> Vererbung, Die Austauschbarkeit

> Vererbung, Die Austauschbarkeit Objektorientierte Programmierung (OOP) > Vererbung, Die Austauschbarkeit Mark Egloff 2006 1 Lernziel Heute Abend > Sie lernen wie Objekte gezielt kompatibel werden und somit ausgetauscht werden können

Mehr

Ersetzbarkeit, Client-Server Beziehungen

Ersetzbarkeit, Client-Server Beziehungen Ersetzbarkeit, Client-Server Beziehungen 182.132 VL Objektorientierte Programmierung Raimund Kirner Mitwirkung an Folienerstellung: Peter Puschner, basieren auf den Folien von Franz Puntigam, TU Wien Überblick

Mehr

Einführung in das Objektorientierte Programmieren mit C++

Einführung in das Objektorientierte Programmieren mit C++ BEREICH DATENTECHNIK I CP 500 00 TH 02 Einführung in das Objektorientierte Programmieren mit C++ Kapitel 5 5. Überladen von Operatoren 5.1. Allgemeines 5.2. Operator-Funktionen 5.3. Zuweisungs-Operator

Mehr

PIWIN I. Praktische Informatik für Wirtschaftsmathematiker, Ingenieure und Naturwissenschaftler I. Vorlesung 3 SWS WS 2007/2008

PIWIN I. Praktische Informatik für Wirtschaftsmathematiker, Ingenieure und Naturwissenschaftler I. Vorlesung 3 SWS WS 2007/2008 PIWIN I Kap. 7 Objektorientierte Programmierung - Einführung 1 PIWIN I Praktische Informatik für Wirtschaftsmathematiker, Ingenieure und Naturwissenschaftler I Vorlesung 3 SWS WS 2007/2008 FB Informatik

Mehr

Zum Abschluss wird gezeigt, wie aus einem C++ Quell-Programm ein ausführbares Programm erzeugt wird. 1. Installation von NetBeans...

Zum Abschluss wird gezeigt, wie aus einem C++ Quell-Programm ein ausführbares Programm erzeugt wird. 1. Installation von NetBeans... Erste Schritte Dieser Teil der Veranstaltung gibt einen ersten Eindruck der Programmierung mit C++. Es wird ein erstes Gefühl von Programmiersprachen vermittelt, ohne auf die gezeigten Bestandteile genau

Mehr

Technische Infor matik 2 C/C++-Kurs. Datenabstraktion (Klassen) 2005 AG Rechner netze 4.1

Technische Infor matik 2 C/C++-Kurs. Datenabstraktion (Klassen) 2005 AG Rechner netze 4.1 Technische Infor matik 2 C/C++-Kurs Datenabstraktion (Klassen) 2005 AG Rechner netze 4.1 Overloading Überladene Funktionen Auswahl einer Funktion anhand ihrer Signatur Signatur : Name + Parameter Rückgabe-Wer

Mehr

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI Universität Osnabrück Drei-Schichten-Architektur 3 - Objektorientierte Programmierung in Java Vorlesung 6: 3-Schichten-Architektur Fachkonzept - GUI SS 2005 Prof. Dr. F.M. Thiesing, FH Dortmund Ein großer

Mehr

Grundlagen der Informatik Objektorientierte Software-Entwicklung

Grundlagen der Informatik Objektorientierte Software-Entwicklung Grundlagen der Informatik Objektorientierte Software-Entwicklung Prof. Dr. Bernhard Schiefer (basierend auf Unterlagen von Prof. Dr. Duque-Antón) bernhard.schiefer@fh-kl.de http://www.fh-kl.de/~schiefer

Mehr

Einführung in die Programmierung mit Java. Hörsaalübung

Einführung in die Programmierung mit Java. Hörsaalübung Einführung in die Programmierung mit Java Hörsaalübung Folie 1 Grundlagen der Objektorientierung Seit Anfang der Neunzigerjahre Standardmethode der Softwareentwicklung. Die OOP Objektorientierte Programmierung

Mehr

DAP2-Programmierpraktikum Einführung in C++ (Teil 1)

DAP2-Programmierpraktikum Einführung in C++ (Teil 1) DAP2-Programmierpraktikum Einführung in C++ (Teil 1) Carsten Gutwenger 11. April 2008 Lehrstuhl 11 Algorithm Engineering Fakultät für Informatik, TU Dortmund Überblick Mein erstes C++-Programm Namensräume

Mehr

Bedienung von BlueJ. Klassenanzeige

Bedienung von BlueJ. Klassenanzeige Im Folgenden werden wichtige Funktionen für den Einsatz von BlueJ im Unterricht beschrieben. Hierbei wird auf den Umgang mit Projekten, Klassen und Objekten eingegangen. Abgeschlossen wird dieses Dokument

Mehr

Fakultät Angewandte Informatik Lehrprofessur für Informatik 23.01.2012

Fakultät Angewandte Informatik Lehrprofessur für Informatik 23.01.2012 WS 2011/2012 Fakultät Angewandte Informatik Lehrprofessur für Informatik 23.01.2012 Prof. Dr. Robert Lorenz Musterlösung zur Vorlesung Informatik I, Extrablatt zu komplexen Datenstrukturen Aufgabe 45 **

Mehr

C++ - Funktionen und mehr. Kerstin Gößner und Ralf Wondratschek

C++ - Funktionen und mehr. Kerstin Gößner und Ralf Wondratschek C++ - Funktionen und mehr Kerstin Gößner und Ralf Wondratschek Übersicht Deklaration, Definition und Initialisierung Variablen- und Konstantendeklaration Funktionsaufrufe und rückgabewerte Technische Grundlage

Mehr

13. Tutorium zu Programmieren

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

Mehr

Klassenattribute und -methoden, Vererbung

Klassenattribute und -methoden, Vererbung Klassenattribute und -methoden, Vererbung Michael Dienert 27. März 2002 1 Prüfungsaufgabe Anwendungsentwicklung Winter 2001 Die folgende Aufgabe stammt aus der Abschlussprüfung für Fachinformatiker Anwendungsentwicklung

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

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

Codingstandard. Softwareentwicklung Praktikum Stand: 27.02.2008

Codingstandard. Softwareentwicklung Praktikum Stand: 27.02.2008 I. Einleitung II. Codingstandard Softwareentwicklung Praktikum Stand: 27.02.2008 Wie in der Vorlesung schon ausgeführt wurde, ist die Lesbarkeit und Wartbarkeit des Sourcecodes ein sehr wichtiges Kriterium

Mehr

Client-Server-Beziehungen

Client-Server-Beziehungen Client-Server-Beziehungen Server bietet Dienste an, Client nutzt Dienste Objekt ist gleichzeitig Client und Server Vertrag zwischen Client und Server: Client erfüllt Vorbedingungen eines Dienstes Server

Mehr

Objektorientierte Programmierung

Objektorientierte Programmierung Objektorientierte Programmierung Ein Computerprogramm besteht aus Funktionen (Programmabschnitten, die etwas tun) und Variablen (Speicherplätzen für Informationen). Werden Funktionen aktiviert, verändern

Mehr

Einführung in die Programmierung mit C++

Einführung in die Programmierung mit C++ 1 Seite 1 Einführung in die Programmierung mit C++ Teil IV - Weiterführende Themen 14. Modularisierung und Automatisierung Was heißt Modularisierung? Seite 2 bisher Programm komplett in einer Datei längere

Mehr

Programmieren in C/C++ und MATLAB

Programmieren in C/C++ und MATLAB Programmieren in C/C++ und MATLAB Sven Willert Christian-Albrechts-Universität zu Kiel CAU 2-1 Datentypen und Formate Mit der Festlegung des Datentyps wird die Art bestimmt, mit der der Computer die Informationen

Mehr

Funktionen und Parameter

Funktionen und Parameter Funktionen in C++ Funktionen und Parameter Wie in Java: Parameter sind lokale Variablen Argumente werden bei Aufruf zugewiesen Extras: Zeiger-Parameter für alle Typen: als Rückgabewerte um große Kopien

Mehr

Inhalt. 1. Sprachspezifische Fehlerrisiken C++ Java. Smalltalk. 2. Coverage - Modelle. Statement Coverage. Branch Coverage

Inhalt. 1. Sprachspezifische Fehlerrisiken C++ Java. Smalltalk. 2. Coverage - Modelle. Statement Coverage. Branch Coverage Inhalt 1. Sprachspezifische Fehlerrisiken C++ Java Smalltalk 2. Coverage - Modelle Statement Coverage Branch Coverage Inkrementelles Testen von Klassen Testen Polymorpher Bindungen Optimistischer Ausblick

Mehr

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

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf http://informatik.swoke.de. Seite 1 von 18 Kapitel 3 Datentypen und Variablen Seite 1 von 18 Datentypen - Einführung - Für jede Variable muss ein Datentyp festgelegt werden. - Hierdurch werden die Wertemenge und die verwendbaren Operatoren festgelegt.

Mehr

Grundlagen der Informatik - 6. Praktikum

Grundlagen der Informatik - 6. Praktikum Grundlagen der Informatik - 6. Praktikum In diesem Praktikum soll es neben der Anwendung von Funktionsdefinitionen auch um einfache Prinzipien der verteilten Quelltext-Strukturierung gehen. Diese spielt

Mehr

Microsoft Visual C# 2008

Microsoft Visual C# 2008 John Sharp 13 Microsoft Visual C# 2008 Schritt für Schritt 13 13 14 15 15 16 16 17 17 17 21 22 22 23 25 26 II 40 51 Press 53 54 54 55 55 56 56 57 58 63 63 64 Inhaltsverzeichnis Einleitung 13 Einführung

Mehr

Projekt AGB-10 Fremdprojektanalyse

Projekt AGB-10 Fremdprojektanalyse Projekt AGB-10 Fremdprojektanalyse 17. Mai 2010 1 Inhaltsverzeichnis 1 Allgemeines 3 2 Produktübersicht 3 3 Grundsätzliche Struktur und Entwurfsprinzipien für das Gesamtsystem 3 3.1 Die Prefuse Library...............................

Mehr

Schnittstellen implementieren am Beispiel Suchbaum

Schnittstellen implementieren am Beispiel Suchbaum Motivation Informatik mit Java und BlueJ Schnittstellen implementieren am Beispiel Suchbaum von Bernhard Rosing Schreiben Sie eine Klasse Person, deren Instanzen in ein TreeSet (Suchbaum) eingefügt werden

Mehr

Der C++ Crashkurs v1.0

Der C++ Crashkurs v1.0 Der C++ Crashkurs v1.0 Daniel Stöckel, M. Sc. October 14, 2013 1 Grundlegendes 1.1 Das erste Programm Wir beginnen mit einem einfachen Hello world Programm. Listing 1: hello world.cpp // Einbinden der

Mehr

CORBA Implementierung von Client und Server

CORBA Implementierung von Client und Server CORBA Implementierung von Client und Server J. Heinzelreiter WS 2003/04 Implementierung des Clients Initialisierung und Freigabe des ORBs. Mapping von Interfaces. Behandlung von Objektreferenzen. Verwaltung

Mehr

Erste Schritte in Java

Erste Schritte in Java Erste Schritte in Java Im einführenden Kapitel haben wir die Grundbegriffe der imperativen Programmierung an einem Beispiel (Algorithmus von Euklid) kennengelernt. In diesem Kapitel sehen wir uns an einem

Mehr

Grundlagen Programmierung

Grundlagen Programmierung 1. Aufgabe (Spielen mit Objekten) Gegeben sei der auch von der Veranstaltungsseite erhältliche Programmcode auf der rechten Seite, der im Detail zuerst nicht verstanden werden muss. a) Erzeugen Sie sich

Mehr

Softwaretechnik (Medieninformatik) Überblick: 6. Objektorientiertes Design

Softwaretechnik (Medieninformatik) Überblick: 6. Objektorientiertes Design Softwaretechnik (Medieninformatik) Überblick: 6.1 Einleitung 6.2 Verfeinerung des Klassenmodells 6.3 Sequenzdiagramme 6.4 Umsetzung der Analysekonstrukte in das Design 6.5 Fallstudie 6.6 Software Kontrakte

Mehr

Einführung in die Programmierung Konstanten, dynamische Datenstrukturen. Arvid Terzibaschian

Einführung in die Programmierung Konstanten, dynamische Datenstrukturen. Arvid Terzibaschian Einführung in die Programmierung Arvid Terzibaschian 1 Konstanten 2 Motivation Unveränderliche, wichtige Werte mathematische Konstanten z.b. PI String-Konstanten wie z.b. häufige statische Meldungen mögliche

Mehr

Tutorium Java Ein Überblick. Helge Janicke

Tutorium Java Ein Überblick. Helge Janicke Tutorium Java Ein Überblick Helge Janicke 26. Oktober 2000 1 VORRAUSSETZUNGEN ZUM PROGRAMMIEREN MIT JAVA. 1 1 Vorraussetzungen zum Programmieren mit Java. Was braucht man, wenn man mit Java programmieren

Mehr