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

Kapitel 6. Vererbung

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

Mehr

Angewandte Mathematik und Programmierung

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

Mehr

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

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

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

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

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

Objektorientierte Programmierung Programmierkurs C++ Kapitel 7:Objektorientierte Programmierung Seite 1 Objektorientierte Programmierung If programming in PASCAL is like put in a straightjacket, then programming in C is like playing with

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

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

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

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

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

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

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

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

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

Abschnitt 9: Schnittstellen: Interfaces

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

Mehr

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

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

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

Objektorientierte Programmierung mit C++ Zusammenfassung der wichtigsten Topics rund um die objektorientierte Programmierung mit C++11

Objektorientierte Programmierung mit C++ Zusammenfassung der wichtigsten Topics rund um die objektorientierte Programmierung mit C++11 Objektorientierte Programmierung mit C++ Zusammenfassung der wichtigsten Topics rund um die objektorientierte Programmierung mit C++11 Wozu objektorientiertes Programmieren? Die Welt besteht für den Menschen

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

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

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

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

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

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

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

Teil 6: Klassenkonzept. Prof. Dr. Herbert Fischer Fachhochschule Deggendorf Prof. Dr. Manfred Beham Fachhochschule Amberg-Weiden

Teil 6: Klassenkonzept. Prof. Dr. Herbert Fischer Fachhochschule Deggendorf Prof. Dr. Manfred Beham Fachhochschule Amberg-Weiden Teil 6: Klassenkonzept Prof. Dr. Herbert Fischer Fachhochschule Deggendorf Prof. Dr. Manfred Beham Fachhochschule Amberg-Weiden Inhaltsverzeichnis 6 Klassenkonzept...3 6.1 Was ist eine Klasse?... 3 6.2

Mehr

Kapitel 10: Subklassen / Vererbung

Kapitel 10: Subklassen / Vererbung 10. Subklassen/Vererbung 10-1 Objektorientierte Programmierung (Winter 2006/2007) Kapitel 10: Subklassen / Vererbung Deklaration von Subklassen Vererbung von Daten und Funktionen Überschreiben/Redefinition,

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

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

C/C++-Programmierung

C/C++-Programmierung 1 C/C++-Programmierung new/delete, virtual, Typumwandlungen Sebastian Hack Christoph Mallon (hack mallon)@cs.uni-sb.de Fachbereich Informatik Universität des Saarlandes Wintersemester 2009/2010 2 new/delete

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

Objektorientierte Programmierung OOP

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

Mehr

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

Objektorientierte Programmiersprachen

Objektorientierte Programmiersprachen Objektorientierte Programmiersprachen 1960 Algol 1970 Simula Pascal 1980 Smalltalk C Ada 1990 C++ Eiffel Eine ovale Box symbolisiert eine objektorientierte Programmiersprache. Eine rechteckige Box steht

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

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

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

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

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

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

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

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

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

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

Objektbasierte Entwicklung

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

Mehr

13 OOP MIT DELPHI. Records und Klassen Ein Vergleich

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

Mehr

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

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

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

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

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

Mehr

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

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

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

Vererbung und Polymorphismus

Vererbung und Polymorphismus Vererbung und Polymorphismus Benno List OO Get-Together 29.5.06 B. List 29.5.06 Vererbung und Polymorphismus Page 1 Klassen (Wiederholung) Klasse: Datenstruktur mit data members: Variablen: enthalten Informationen

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

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

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

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

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

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

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

5. Abstrakte Klassen

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

Mehr

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

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

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

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

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

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

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

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

Mehr

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

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

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

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

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

Mehr

Kompetent objektorientiert programmieren

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

Mehr

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

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

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

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

Client-Server Beziehungen

Client-Server Beziehungen Ersetzbarkeit, Client-Server Beziehungen 182.132 VL Objektorientierte Programmierung Peter Puschner nach Folien von Franz Puntigam, TU Wien Überblick Ersetzbarkeit Kovarianz, Kontravarianz, Invarianz Client-Server

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

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

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

Sichtbarkeit & statische Methoden. Einsatz von Sichtbarkeit Einsatz statischer Methoden programmatische Realisierung 2 Beispielaufgaben

Sichtbarkeit & statische Methoden. Einsatz von Sichtbarkeit Einsatz statischer Methoden programmatische Realisierung 2 Beispielaufgaben Sichtbarkeit & statische Methoden Einsatz von Sichtbarkeit Einsatz statischer Methoden programmatische Realisierung 2 Beispielaufgaben Nicht sichtbare Methoden Wollen Eltern bestimmte Methoden vor den

Mehr

Ulla Kirch Peter Prinz C+ + Lernen und professionell anwenden. mitp

Ulla Kirch Peter Prinz C+ + Lernen und professionell anwenden. mitp Ulla Kirch Peter Prinz C+ + Lernen und professionell anwenden mitp Inhaltsverzeichnis Einleitung 19 Grundlagen 21 Entwicklung und Eigenschaften von C++ 22 Objektorientierte Programmierung 24 Erstellen

Mehr

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

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

Mehr

Praktikum Betriebssysteme 1. Aufgabe (1)

Praktikum Betriebssysteme 1. Aufgabe (1) FG TECHNISCHE INFORMATIK U BS 041 01 TH 09 Praktikum Betriebssysteme 1. Aufgabe (1) Es wird ein unter LINUX lauffähiges C++-Programm ptab, mit dem Informationen über die Partitionierung von Festplatten

Mehr