Teil 9: Vererbung. Prof. Dr. Herbert Fischer Fachhochschule Deggendorf Prof. Dr. Manfred Beham Fachhochschule Amberg-Weiden
|
|
- Benedikt Schäfer
- vor 8 Jahren
- Abrufe
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
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
MehrVerhindert, 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:
MehrVorkurs 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:
MehrAngewandte 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
MehrObjektorientierte 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/
MehrProgrammieren 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
MehrC++ - 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
MehrFolge 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,
MehrJava: 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
MehrObjektorientierte 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
MehrObjektorientierte Programmierung OOP
Objektorientierte Programmierung OOP Objektorientierte Programmierung OOP Ronja Düffel WS2012/13 08. Oktober 2013 Objektorientierte Programmierung OOP Objektorientierte Programmierung Objektorientierte
MehrObjektorientierte 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
MehrEinfü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
MehrEinfü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
MehrStellen 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.
Mehr5. 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:
Mehr1. 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:
MehrGetName(), 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
MehrSoftware 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
MehrObjektbasierte 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
MehrJava 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
MehrKapitel 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
MehrVererbung & 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
MehrGrundlagen 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
MehrLineargleichungssysteme: Additions-/ Subtraktionsverfahren
Lineargleichungssysteme: Additions-/ Subtraktionsverfahren W. Kippels 22. Februar 2014 Inhaltsverzeichnis 1 Einleitung 2 2 Lineargleichungssysteme zweiten Grades 2 3 Lineargleichungssysteme höheren als
MehrArbeiten 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
Mehr5. 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,
MehrPrimzahlen 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
Mehr3 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
MehrProfessionelle 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
MehrPrinzipien 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........................
MehrOrdner 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.
MehrKapitel 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
Mehr5.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
MehrOO 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
MehrSEP 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
MehrUrlaubsregel 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
MehrUnterprogramme. 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
MehrObjektorientierte 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
MehrBinä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
MehrFachdidaktik 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,
Mehr13 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,
MehrZä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 --
MehrEinfü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
MehrMethoden. 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
MehrC/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
MehrFassade. 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
MehrObjektorientierte 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
MehrProgrammieren - 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.
MehrSichtbarkeit & 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
MehrEs 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
MehrKlassenbeziehungen & Vererbung
Klassenbeziehungen & Vererbung VL Objektorientierte Programmierung Raimund Kirner teilweise nach Folien von Franz Puntigam, TU Wien Überblick Arten von Klassenbeziehungen Untertypen versus Vererbung in
MehrInformatik 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
Mehrinfach 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
MehrII. 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
MehrFolge 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
MehrKlassendiagramm. 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
Mehr1. 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:
MehrWas 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 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
MehrBenutzeranleitung 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...
MehrZiel, 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
MehrJava 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
MehrAlltagsnotizen 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,
Mehrgeben. 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
MehrNeuanlage 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
MehrBauteilattribute 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...
MehrFachbericht 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
MehrKapitel 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
Mehr1. 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
MehrBedienung 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
MehrExcel 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
MehrEigenen 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
MehrDiese 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,
MehrAbamsoft 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
MehrOutlook. 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
Mehr6 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
MehrDas 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
MehrEinfü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
MehrFakultä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 **
MehrProgrammieren 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
MehrDatensicherung. 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
MehrDatenbank-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 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
MehrDrei-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
MehrProgrammieren 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,
MehrFTP-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
Mehr1 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
MehrQt-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
MehrPHP 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
MehrErstellen 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,
MehrMotivation. 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
Mehr1. 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.
MehrZeichen 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
MehrArchiv - 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
MehrProgrammieren 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,
MehrSoftware 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)
MehrM. 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
MehrSANDBOXIE 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:
Mehr1 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