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

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

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

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

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

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

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

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

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

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

Objektorientierte Programmierung für Anfänger am Beispiel PHP

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

Mehr

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

Einführung in die Java- Programmierung

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

Mehr

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster Es gibt in Excel unter anderem die so genannten Suchfunktionen / Matrixfunktionen Damit können Sie Werte innerhalb eines bestimmten Bereichs suchen. Als Beispiel möchte ich die Funktion Sverweis zeigen.

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

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

Software Engineering Klassendiagramme Assoziationen

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

Mehr

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

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

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

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

Grundlagen von Python

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

Mehr

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

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

Mehr

Arbeiten mit UMLed und Delphi

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

Mehr

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

Primzahlen und RSA-Verschlüsselung

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

Mehr

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

Professionelle Seminare im Bereich MS-Office

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

Mehr

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

Ordner Berechtigung vergeben Zugriffsrechte unter Windows einrichten

Ordner Berechtigung vergeben Zugriffsrechte unter Windows einrichten Ordner Berechtigung vergeben Zugriffsrechte unter Windows einrichten Was sind Berechtigungen? Unter Berechtigungen werden ganz allgemein die Zugriffsrechte auf Dateien und Verzeichnisse (Ordner) verstanden.

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.2 Neue Projekte erstellen

5.2 Neue Projekte erstellen 5.2 Neue Projekte erstellen Das Bearbeiten von bestehenden Projekten und Objekten ist ja nicht schlecht wie aber können Sie neue Objekte hinzufügen oder gar völlig neue Projekte erstellen? Die Antwort

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

SEP 114. Design by Contract

SEP 114. Design by Contract Design by Contract SEP 114 Design by Contract Teile das zu entwickelnde Programm in kleine Einheiten (Klassen, Methoden), die unabhängig voneinander entwickelt und überprüft werden können. Einheiten mit

Mehr

Urlaubsregel in David

Urlaubsregel in David Urlaubsregel in David Inhaltsverzeichnis KlickDown Beitrag von Tobit...3 Präambel...3 Benachrichtigung externer Absender...3 Erstellen oder Anpassen des Anworttextes...3 Erstellen oder Anpassen der Auto-Reply-Regel...5

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

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

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

Mehr

Fachdidaktik der Informatik 18.12.08 Jörg Depner, Kathrin Gaißer

Fachdidaktik der Informatik 18.12.08 Jörg Depner, Kathrin Gaißer Fachdidaktik der Informatik 18.12.08 Jörg Depner, Kathrin Gaißer Klassendiagramme Ein Klassendiagramm dient in der objektorientierten Softwareentwicklung zur Darstellung von Klassen und den Beziehungen,

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

Zählen von Objekten einer bestimmten Klasse

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

Mehr

Einführung in die Programmierung

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

Mehr

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

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

Fassade. Objektbasiertes Strukturmuster. C. Restorff & M. Rohlfing

Fassade. Objektbasiertes Strukturmuster. C. Restorff & M. Rohlfing Fassade Objektbasiertes Strukturmuster C. Restorff & M. Rohlfing Übersicht Motivation Anwendbarkeit Struktur Teilnehmer Interaktion Konsequenz Implementierung Beispiel Bekannte Verwendung Verwandte Muster

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

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

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

Es sollte die MS-DOS Eingabeaufforderung starten. Geben Sie nun den Befehl javac ein.

Es sollte die MS-DOS Eingabeaufforderung starten. Geben Sie nun den Befehl javac ein. Schritt 1: Installation des Javacompilers JDK. Der erste Start mit Eclipse Bevor Sie den Java-Compiler installieren sollten Sie sich vergewissern, ob er eventuell schon installiert ist. Gehen sie wie folgt

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

Informatik 2 Labor 2 Programmieren in MATLAB Georg Richter

Informatik 2 Labor 2 Programmieren in MATLAB Georg Richter Informatik 2 Labor 2 Programmieren in MATLAB Georg Richter Aufgabe 3: Konto Um Geldbeträge korrekt zu verwalten, sind zwecks Vermeidung von Rundungsfehlern entweder alle Beträge in Cents umzuwandeln und

Mehr

infach Geld FBV Ihr Weg zum finanzellen Erfolg Florian Mock

infach Geld FBV Ihr Weg zum finanzellen Erfolg Florian Mock infach Ihr Weg zum finanzellen Erfolg Geld Florian Mock FBV Die Grundlagen für finanziellen Erfolg Denn Sie müssten anschließend wieder vom Gehaltskonto Rückzahlungen in Höhe der Entnahmen vornehmen, um

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

Folge 19 - Bäume. 19.1 Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12

Folge 19 - Bäume. 19.1 Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12 Grundlagen: Folge 19 - Bäume 19.1 Binärbäume - Allgemeines Unter Bäumen versteht man in der Informatik Datenstrukturen, bei denen jedes Element mindestens zwei Nachfolger hat. Bereits in der Folge 17 haben

Mehr

Klassendiagramm. Kurzer Überblick über UML - Stand 2006. BlaBla

Klassendiagramm. Kurzer Überblick über UML - Stand 2006. BlaBla BlaBla Diese Kennzeichnungen sind nur Erläuterungen und nicht Bestandteil des Diagramms Quelle: P.Grässle, H.Baumann, P.Baumann, UML projektorientiert, Galileo Verlag, 2003 21 Primäre Begriffe Kapselung

Mehr

1. Man schreibe die folgenden Aussagen jeweils in einen normalen Satz um. Zum Beispiel kann man die Aussage:

1. Man schreibe die folgenden Aussagen jeweils in einen normalen Satz um. Zum Beispiel kann man die Aussage: Zählen und Zahlbereiche Übungsblatt 1 1. Man schreibe die folgenden Aussagen jeweils in einen normalen Satz um. Zum Beispiel kann man die Aussage: Für alle m, n N gilt m + n = n + m. in den Satz umschreiben:

Mehr

Was meinen die Leute eigentlich mit: Grexit?

Was meinen die Leute eigentlich mit: Grexit? Was meinen die Leute eigentlich mit: Grexit? Grexit sind eigentlich 2 Wörter. 1. Griechenland 2. Exit Exit ist ein englisches Wort. Es bedeutet: Ausgang. Aber was haben diese 2 Sachen mit-einander zu tun?

Mehr

.NET Code schützen. Projekt.NET. Version 1.0

.NET Code schützen. Projekt.NET. Version 1.0 .NET Code schützen Projekt.NET Informationsmaterial zum Schützen des.net Codes Version 1.0 Autor: Status: Ablage: Empfänger: Seiten: D. Hoyer 1 / 6 Verteiler : Dokument1 Seite 1 von 1 Änderungsprotokoll

Mehr

Benutzeranleitung Superadmin Tool

Benutzeranleitung Superadmin Tool Benutzeranleitung Inhalt 1 Einleitung & Voraussetzungen... 2 2 Aufruf des... 3 3 Konto für neuen Benutzer erstellen... 3 4 Services einem Konto hinzufügen... 5 5 Benutzer über neues Konto informieren...

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

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

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

geben. Die Wahrscheinlichkeit von 100% ist hier demnach nur der Gehen wir einmal davon aus, dass die von uns angenommenen

geben. Die Wahrscheinlichkeit von 100% ist hier demnach nur der Gehen wir einmal davon aus, dass die von uns angenommenen geben. Die Wahrscheinlichkeit von 100% ist hier demnach nur der Vollständigkeit halber aufgeführt. Gehen wir einmal davon aus, dass die von uns angenommenen 70% im Beispiel exakt berechnet sind. Was würde

Mehr

Neuanlage des Bankzugangs ohne das bestehende Konto zu löschen

Neuanlage des Bankzugangs ohne das bestehende Konto zu löschen 1 Neuanlage des Bankzugangs ohne das bestehende Konto zu löschen In moneyplex lässt sich ein Konto und ein Bankzugang nur einmal anlegen. Wenn sich der Bankzugang geändert hat oder das Sicherheitsmedium

Mehr

Bauteilattribute als Sachdaten anzeigen

Bauteilattribute als Sachdaten anzeigen Mit den speedikon Attributfiltern können Sie die speedikon Attribute eines Bauteils als MicroStation Sachdaten an die Elemente anhängen Inhalte Was ist ein speedikon Attribut?... 3 Eigene Attribute vergeben...

Mehr

Fachbericht zum Thema: Anforderungen an ein Datenbanksystem

Fachbericht zum Thema: Anforderungen an ein Datenbanksystem Fachbericht zum Thema: Anforderungen an ein Datenbanksystem von André Franken 1 Inhaltsverzeichnis 1 Inhaltsverzeichnis 1 2 Einführung 2 2.1 Gründe für den Einsatz von DB-Systemen 2 2.2 Definition: Datenbank

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

1. Einführung. 2. Weitere Konten anlegen

1. Einführung. 2. Weitere Konten anlegen 1. Einführung In orgamax stehen Ihnen die gängigsten Konten des Kontenrahmens SKR03 und SKR04 zur Verfügung. Damit sind im Normalfall alle Konten abgedeckt, die Sie zur Verbuchung benötigen. Eine ausführliche

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

Excel Pivot-Tabellen 2010 effektiv

Excel Pivot-Tabellen 2010 effektiv 7.2 Berechnete Felder Falls in der Datenquelle die Zahlen nicht in der Form vorliegen wie Sie diese benötigen, können Sie die gewünschten Ergebnisse mit Formeln berechnen. Dazu erzeugen Sie ein berechnetes

Mehr

Eigenen Farbverlauf erstellen

Eigenen Farbverlauf erstellen Diese Serie ist an totale Neulinge gerichtet. Neu bei PhotoLine, evtl. sogar komplett neu, was Bildbearbeitung betrifft. So versuche ich, hier alles einfach zu halten. Ich habe sogar PhotoLine ein zweites

Mehr

Diese Ansicht erhalten Sie nach der erfolgreichen Anmeldung bei Wordpress.

Diese Ansicht erhalten Sie nach der erfolgreichen Anmeldung bei Wordpress. Anmeldung http://www.ihredomain.de/wp-admin Dashboard Diese Ansicht erhalten Sie nach der erfolgreichen Anmeldung bei Wordpress. Das Dashboard gibt Ihnen eine kurze Übersicht, z.b. Anzahl der Beiträge,

Mehr

Abamsoft Finos im Zusammenspiel mit shop to date von DATA BECKER

Abamsoft Finos im Zusammenspiel mit shop to date von DATA BECKER Abamsoft Finos im Zusammenspiel mit shop to date von DATA BECKER Abamsoft Finos in Verbindung mit der Webshopanbindung wurde speziell auf die Shop-Software shop to date von DATA BECKER abgestimmt. Mit

Mehr

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang sysplus.ch outlook - mail-grundlagen Seite 1/8 Outlook Mail-Grundlagen Posteingang Es gibt verschiedene Möglichkeiten, um zum Posteingang zu gelangen. Man kann links im Outlook-Fenster auf die Schaltfläche

Mehr

6 Das Kopieren eines bereits bestehenden Inhaltselements

6 Das Kopieren eines bereits bestehenden Inhaltselements 6 Das Kopieren eines bereits bestehenden Inhaltselements Inhaltsverzeichnis 6 Das Kopieren eines bereits bestehenden Inhaltselements 1 Vorbemerkung.......................................... 1 6.1 Schritt

Mehr

Das sogenannte Beamen ist auch in EEP möglich ohne das Zusatzprogramm Beamer. Zwar etwas umständlicher aber es funktioniert

Das sogenannte Beamen ist auch in EEP möglich ohne das Zusatzprogramm Beamer. Zwar etwas umständlicher aber es funktioniert Beamen in EEP Das sogenannte Beamen ist auch in EEP möglich ohne das Zusatzprogramm Beamer. Zwar etwas umständlicher aber es funktioniert Zuerst musst du dir 2 Programme besorgen und zwar: Albert, das

Mehr

Einfügen von Bildern innerhalb eines Beitrages

Einfügen von Bildern innerhalb eines Beitrages Version 1.2 Einfügen von Bildern innerhalb eines Beitrages Um eigene Bilder ins Forum einzufügen, gibt es zwei Möglichkeiten. 1.) Ein Bild vom eigenem PC wird auf den Webspace von Baue-die-Bismarck.de

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

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

Datensicherung. Beschreibung der Datensicherung

Datensicherung. Beschreibung der Datensicherung Datensicherung Mit dem Datensicherungsprogramm können Sie Ihre persönlichen Daten problemlos Sichern. Es ist möglich eine komplette Datensicherung durchzuführen, aber auch nur die neuen und geänderten

Mehr

Datenbank-Verschlüsselung mit DbDefence und Webanwendungen.

Datenbank-Verschlüsselung mit DbDefence und Webanwendungen. Datenbank-Verschlüsselung mit DbDefence und Webanwendungen. In diesem Artikel werden wir Ihnen zeigen, wie Sie eine Datenbank verschlüsseln können, um den Zugriff einzuschränken, aber trotzdem noch eine

Mehr

Ändern eines Kontotyps

Ändern eines Kontotyps Ändern eines Kontotyps Gelegentlich kann es vorkommen, daß man den Typ eines Kontos ändern möchte. So z.b., wenn man ein Sparbuch zuerst bewußt als Girokonto angelegt hat, weil nur so der Online-Zugang

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

Programmieren Tutorium

Programmieren Tutorium Programmieren Tutorium Tom Schildhauer Tutorium 12 Universität Karlsruhe (TH) Institut für Programmstrukturen und Datenorganisation (IPD) Lehrstuhl Programmierparadigmen WS 2008/2009 c 2008 by Tom Schildhauer,

Mehr

FTP-Server einrichten mit automatischem Datenupload für SolarView@Fritzbox

FTP-Server einrichten mit automatischem Datenupload für SolarView@Fritzbox FTP-Server einrichten mit automatischem Datenupload für SolarView@Fritzbox Bitte beachten: Der im folgenden beschriebene Provider "www.cwcity.de" dient lediglich als Beispiel. Cwcity.de blendet recht häufig

Mehr

1 Vom Problem zum Programm

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

Mehr

Qt-Projekte mit Visual Studio 2005

Qt-Projekte mit Visual Studio 2005 Qt-Projekte mit Visual Studio 2005 Benötigte Programme: Visual Studio 2005 Vollversion, Microsoft Qt 4 Open Source s. Qt 4-Installationsanleitung Tabelle 1: Benötigte Programme für die Qt-Programmierung

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

Erstellen einer PostScript-Datei unter Windows XP

Erstellen einer PostScript-Datei unter Windows XP Erstellen einer PostScript-Datei unter Windows XP Sie möchten uns Ihre Druckvorlage als PostScript-Datei einreichen. Um Fehler in der Herstellung von vorneherein auszuschließen, möchten wir Sie bitten,

Mehr

Motivation. Formale Grundlagen der Informatik 1 Kapitel 5 Kontextfreie Sprachen. Informales Beispiel. Informales Beispiel.

Motivation. Formale Grundlagen der Informatik 1 Kapitel 5 Kontextfreie Sprachen. Informales Beispiel. Informales Beispiel. Kontextfreie Kontextfreie Motivation Formale rundlagen der Informatik 1 Kapitel 5 Kontextfreie Sprachen Bisher hatten wir Automaten, die Wörter akzeptieren Frank Heitmann heitmann@informatik.uni-hamburg.de

Mehr

1. Zuerst muss der Artikel angelegt werden, damit später die Produktvarianten hinzugefügt werden können.

1. Zuerst muss der Artikel angelegt werden, damit später die Produktvarianten hinzugefügt werden können. Produktvarianten und Downloads erstellen Produktvarianten eignen sich um Artikel mit verschiedenen Optionen wie bspw. ein Herrenhemd in den Farben blau, grün und rot sowie in den Größen S, M und L zu verkaufen.

Mehr

Zeichen bei Zahlen entschlüsseln

Zeichen bei Zahlen entschlüsseln Zeichen bei Zahlen entschlüsseln In diesem Kapitel... Verwendung des Zahlenstrahls Absolut richtige Bestimmung von absoluten Werten Operationen bei Zahlen mit Vorzeichen: Addieren, Subtrahieren, Multiplizieren

Mehr

Archiv - Berechtigungen

Archiv - Berechtigungen Archiv - Berechtigungen - 1 Inhaltsverzeichnis 1. Grunddefinitionen...3 1.1. Mögliche Definitionen...3 1.1.1. Programme...3 1.1.2. Prinzipale...3 1.1.3 Archivzugriff...3 1.2. Leserichtung...3 1.2.1. Ordnerbezogen...3

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

Software Engineering Interaktionsdiagramme

Software Engineering Interaktionsdiagramme Software Engineering Interaktionsdiagramme Prof. Adrian A. Müller, PMP, PSM 1, CSM Fachbereich Informatik und Mikrosystemtechnik 1 Nachrichtenaustausch Welche Nachrichten werden ausgetauscht? (Methodenaufrufe)

Mehr

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

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

Mehr

SANDBOXIE konfigurieren

SANDBOXIE konfigurieren SANDBOXIE konfigurieren für Webbrowser und E-Mail-Programme Dies ist eine kurze Anleitung für die grundlegenden folgender Programme: Webbrowser: Internet Explorer, Mozilla Firefox und Opera E-Mail-Programme:

Mehr

1 Mathematische Grundlagen

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

Mehr