17.04.2000 Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.

Slides:



Advertisements
Ähnliche Präsentationen
Ziele von EINI I + II Einführen in „Informatik“
Advertisements

Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Einführung in die Programmierung Zusammenfassung
Kritische Betrachtung
Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Donnerstag Andreas Döring SS 2004.
der Universität Oldenburg
Java: Objektorientierte Programmierung
Java: Grundlagen der Objektorientierung
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido
Claudio Moraga; Gisbert Dittrich
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 5 Claudio Moraga; Gisbert Dittrich FBI Unido
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 4 Claudio Moraga; Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 2 Gisbert Dittrich; Claudio Moraga FBI Unido
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 10 Claudio Moraga; Gisbert Dittrich FBI Unido
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Vererbung Spezialisierung von Klassen in JAVA möglich durch
C++ Vererbung und Polymorphie
DVG Klassen und Objekte
Einführung in die Programmierung Wintersemester 2013/14 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung
Informatik 1 Übung 8. NACHBESPRECHUNG Übung 8 Rekursion Existiert Weg von A nach B?
EPROG Tutorium Einheit 4 Klassen und Objekte. Wiederholung Schleifen do... while while for break/continue Strings String char Methoden für Strings Arrays.
Einführung in die Programmierung Wintersemester 2012/13 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fakultät.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung Wintersemester 2010/11 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2011/12 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
OOP-Begriffe Abstraktion Modellieren Klasse Objekt Attribute Methoden
OOP-Begriffe Abstraktion Modellieren Klasse Objekt Attribute Methoden
Java-Kurs Übung Besprechung der Hausaufgabe
Java-Kurs - 5. Übung Besprechung der Übungsaufgabe Klassen und Objekte
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer, Dr. Thomas H. Kolbe Einführung in die Programmierung mit Java 9. Vorlesung WS 2001/2002.
Java-Kurs - 9. Übung Besprechung der Hausaufgabe
Vererbung in Java. public abstract class Form { protected int breite; protected int hoehe; protected String farbe; /** * Erzeuge eine Form der Breite.
Objektorientierung Gliederung von Daten und Funktionen zu Objekten
Einführung in die Programmierung
Java-Kurs - 8. Übung Klassen und Objekte: Vererbung
Einführung in die Programmierung
Einführung in die Programmierung
 Präsentation transkript:

Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure II Prof. Dr. Gisbert Dittrich

15-2 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Gliederung Ziele von Klassen (Wiederholung) Phänomene bei der elementaren Vererbung Syntax Überschreiben von Methoden Auflösung von Zirkularität Einführendes Beispiel: string_Klasse, Woerter_Gross Beispiel: Person, Mann, Frau

15-3 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Ziele von Klassen Schon besprochen: Kapselung von Attributen+Methoden (wie struct ) Erweiterte Möglichkeiten gegenüber struct – Überladen von Funktionen – Konstruktoren – Destruktoren Neu: Effiziente Wiederverwendbarkeit – dazu:---> Vererbung

15-4 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Neudefinition der Klasse? Bisherige Mittel zum Modellieren von ähnlichen Klassen: Neudefinition der Klasse – z.B.: Code kann kopiert werden. Das ist nicht so gut: langweilig, fehleranfällig, nicht änderungsfreundlich.

15-5 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Alternative: Vererbung Seien A und B Klassen. A ist Oberklasse von B ( B ist Unterklasse von A ) --> B erbt Attribute und Methoden von A, d.h. B kennt Attribute und Methoden von A. (Wie genau, wird im folgenden detailliert angegeben.) B fügt neue Attribute und Methoden zu denen von A hinzu, ggf. werden (alte) Methoden neu definiert. Jede Instanz von B ist auch Instanz von A.

15-6 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Beispiel: String - Nur Großbuchstaben Definiere String als Klasse: string_Klasse: – Attribute: Zeichenkette, Länge – Methoden: Konstruktor, Destruktor, Lies, Schreibe Betrachte Unterklasse Woerter_Gross: Für Zeichenketten, die Buchstaben nur als Großbuchstaben aufweisen.

15-7 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung string_Klasse 1. Versuch class string_Klasse { private: char * s; int laenge; public: string_Klasse(char *); ~string_Klasse(); bool lies(char *); void schreib(); char * dieKette(); int DieLaenge(); }; Nicht gut: siehe später !

15-8 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung public besagt an dieser Stelle: Übernahme der Zugriffspezifikationen von string_Klasse in die neue Klasse. die Klasse Woerter_gross erbt von der Klasse string_Klasse: Attribute und Methoden von String_Klasse sind in Woerter_Gross verfügbar. Grundansatz Vererbung class Woerter_Gross:public string_Klasse

15-9 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Grundansatz Vererbung class Woerter_Gross:public string_Klasse { public: Woerter_Gross(char *); void schreib(); };

15-10 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Verfeinerung des Grundansatzes 2 Arten des Verbergens: Geheimnis (auch) vor den Kindern: – A möchte Eigenschaften für sich behalten und nicht beim Vererben weitergeben: – --> Wahl der Zugriffsspezifikation private Familiengeheimnisse: – Attribute und Methoden werden nur Erben bekannt gemacht, nicht aber Außenstehenden: – --> Wahl der Zugriffsspezifikation protected

15-11 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Modifikation von string_Klasse class string_Klasse { protected: char * s; int laenge; public: string_Klasse(char *); ~string_Klasse(); bool lies(char *); void schreib(); char * dieKette(); int DieLaenge(); }; steht also für die Erben (und nur für sie) zur Verfügung

15-12 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Zusammenfassung Alle als public oder protected zugreifbaren Komponenten sind für die Erben sichtbar. Die als private charakterisierten Komponenten sind in ihrer Sichtbarkeit auf die Klasse selbst beschränkt.

15-13 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung private Zugriff nur innerhalb der Klasse protected Zugriff nur innerhalb der Klasse und ihrer Erben public Komponente ist öffentlich zugänglich Zugriffsspezifikation Klassifikationshierarchie

15-14 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Neuer Konstruktor: Heißt ja wie die Klasse public class Woerter_Gross : public string_Klasse { public: Woerter_Gross(char *); void schreib(); }; public besagt hier: Die Zugriffs- spezifikationen für die Komponenten bleiben beim Erben erhalten

15-15 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Konstruktor für Woerter Woerter_Gross::Woerter_Gross(char * t) : string_Klasse(t) { for (int i=0; i < laenge ; i++) if (islower(s[i])) s[i] = toupper(s[i]); } Zugriff auf den Konstruktor der Oberklasse string Zugriff auf das Attribut laenge der Oberklasse

15-16 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Anmerkung Effekt des Konstruktors (im Beispiel): Es wird ein Objekt vom Typ Woerter_Gross geschaffen; die Buchstaben der initialisierenden Zeichenkette sind Großbuchstaben. Der erste Schritt bei der Erzeugung des Objekts besteht im Aufruf des Konstruktors für die Vaterklasse (Syntax!).

15-17 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Redefinition einer Methode Die Methode schreib wird neu definiert (redefiniert, überschrieben); dabei wird die Methode der Vaterklasse verwendet. void Woerter_Gross::schreib(){ cout << Ueberschriebene Methode " << "(Achtung)\t\t"; string_Klasse::schreib(); }

15-18 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung /* Woerter_Gross,* Vorlage EED, EINI II, * SS 99, überarbeitet GD * demonstriert Vererbung (einfach)*/ #include // verwendete Funktionsprototypen: void strcpy(char * nach, char * von); int strlen(char * r); bool islower(char c); char toupper(char c);

15-19 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung /* Woerter_Gross, Fortsetzung 1 */ class string_Klasse { protected: char * s; int laenge; public: string_Klasse(char *); ~string_Klasse(); bool lies(char *); void schreib(); char * dieKette(); int DieLaenge(); };

15-20 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung /* Woerter_Gross, Fortsetzung 2 */ string_Klasse::string_Klasse (char *t) { int lgth = strlen(t); s = new char[lgth+1]; strcpy(s, t); laenge = --lgth; // sonst letztes Zeichen '\0' // mitgezählt } string_Klasse::~string_Klasse() { laenge = -1; delete &s; }

15-21 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung /* Woerter_Gross, Fortsetzung 3 */ bool string_Klasse::lies(char * r) { int strlen(char *); if (strlen(r) <= laenge+1) { laenge = strlen(r); strcpy(s, r); return true; } else return false; } void string_Klasse::schreib() { cout << s << endl; }

15-22 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung /* Woerter_Gross, Fortsetzung 4 */ char * string_Klasse::dieKette() { return s;} int string_Klasse::DieLaenge() { return laenge;} class Woerter_Gross: public string_Klasse { public: Woerter_Gross(char *); void schreib(); };

15-23 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung /* Woerter_Gross, Fortsetzung 5 */ Woerter_Gross::Woerter_Gross(char * t): string_Klasse(t) { for (int i=0; i < laenge ; i++) if (islower(s[i])) s[i] = toupper(s[i]); } void Woerter_Gross::schreib(){ cout << "Ueberschriebene Methode " << "(Achtung)\t\t"; string_Klasse::schreib(); }

15-24 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung /* Woerter_Gross, Fortsetzung 6 */ int main() { string_Klasse *s = new string_Klasse ("aBra"); s->schreib(); s->~string_Klasse(); Woerter_Gross * grS = new Woerter_Gross("abra"); grS->schreib(); cout << "Laenge: " DieLaenge(); return 0; } Woerter_Gross

15-25 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung /* Woerter_Gross, Fortsetzung 7 */ void strcpy(char * nach, char * von) { while (*nach++ = *von++); } int strlen(char * r) { int f = 0; while (r[f++]); return f; }

15-26 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung /* Woerter_Gross, Fortsetzung 8 */ bool islower(char c) { if (('a' <= c) && (c <= 'z')) return true; else return false; } char toupper(char c) { if (islower(c)) return (c - 'a' + 'A'); else return c; }

15-27 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Woerter_Gross Ausgabe aBra Ueberschriebene Methode (Achtung) ABRA Laenge: 4

15-28 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Zusammenfassung Klasse Woerter_Gross ist Spezialfall der Klasse string_Klasse (Wörter enthalten nur Großbuchstaben). Erbende Klasse kann auf alle nicht als private gekennzeichneten Komponenten zugreifen. Die Zugriffsspezifikation protected wurde eingeführt, um den Zugriff angemessen zu regeln

15-29 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Zusammenfassung mußte Ein neuer Konstruktor mußte definiert werden (anderer Name): Der Konstruktor der Oberklasse kann verwendet werden. Eine Methode wurde redefiniert Hierbei wurde auch die gleichnamige Methode des Vaters verwendet. Die Syntax hierfür wurde eingeführt.

15-30 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Frau Mann Person Beispiel: Männer und Frauen Gemeinsame Eigenschaften: Name (Beschränkung auf Vornamen), Vater, Mutter. --> Oberklasse: Person – Obige Eigenschaften dort formulieren

15-31 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung class Person { private: string * Vorname; Frau * Mutter; Mann * Vater; public: Person(char *); Person(string *); ~Person(); string * DerVorname(); void SetzeMutter(Frau *); void SetzeVater(Mann *); void Druck(char *); }; gemeinsame Eigenschaften gemein- same Methoden

15-32 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Anmerkung Gemeinsame Eigenschaften private --> von außen nicht zugreifbar. Auch von Erben nicht: – sonst als protected vereinbart.

15-33 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Modellierung der Klasse Frau Konstruktor (aus Namen und aus Person), hat Ehemann, heiratet, ist Ehefrau von. class Frau: public Person { private: Mann * Ehemann; public: Frau(char *); Frau(Person *); void NimmZumManne(Mann *); Mann * EhefrauVon(); };

15-34 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Analog: Modellierung Klasse Mann Konstruktor (aus Namen und aus Person), hat Ehefrau, heiratet, ist Ehemann von. class Mann: public Person { private: Frau * Ehefrau; public: Mann(char *); Mann (Person *); void NimmZurFrau(Frau *); Frau * EhemannVon(); };

15-35 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Problem: Zirkularität Person erfordert die Kenntnis von Frau, Mann, Mann erfordert die Kenntnis von Person, Frau, Frau erfordert die Kenntnis von Person, Mann. (Erinnert an forward in Pascal.)

15-36 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Lösung Deklaration sieht im Programm so aus: class Mann; class Frau; class Person {... }; class Frau: public Person {... }; class Mann: public Person {... }; Dann erst folgen die Definitionen der Methoden. hier werden die Namen bekanntgemacht

15-37 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Konstruktoren für Klasse Person Konstruktoren für die Klasse sind überladen, einmal Zeichenkette, dann string als Parameter. Person::Person(char * v) { Vorname = new string(v); Vater = NULL; Mutter = NULL; } Person::Person(string * s) { Vorname = s; Vater = NULL; Mutter = NULL; }

15-38 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Weitere Methoden Destruktor: Ruft nur den Destruktor für die Zeichenkette auf Person::~Person() { Vorname->~string(); } n Die anderen Methoden (bis evtl. auf Druck) sollten klar sein. Die Methode Druck druckt den Vornamen aus und ruft ggf. die Druck- Methode für Vater und für Mutter auf.

15-39 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung void Person::Druck(char * s) { cout << s << "(Vorname) " dieKette() << endl; if(Mutter != NULL) { cout << "\nDaten der Mutter:\n"; Mutter->Druck(""); } if(Vater != NULL) { cout << "\nDaten des Vaters:\n "; Vater->Druck(""); } };

15-40 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Bemerkenswert Aufrufe Vater->Druck() und Mutter->Druck() benutzen die Tatsache, daß Vater und Mutter auch vom Typ Person sind. In den Klassen Mann oder Frau sind keine neuen Methoden Druck vereinbart! Dies deutet an: Vererbung erlaubt flexible Modellierung und Programmierung.

15-41 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Konstruktoren und Methoden für die Klasse Mann Mann::Mann(char * v) :Person(v) { Ehefrau = NULL; } Mann::Mann(Person *p) : Person(p->DerVorname()){ Ehefrau = NULL; } void Mann::NimmtZurFrau(Frau * thisLady) { Ehefrau = thisLady; } Frau * Mann::EhemannVon(){ return Ehefrau; }

15-42 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Heiratsroutine void Verheirate(Mann * m, Frau * f){ m->NimmZurFrau(f); f->NimmZumManne(m); } Bemerkenswert: steht außerhalb der Klassendefinitionen.

15-43 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung int main() { Mann * Adam = new Mann("Adam"); Frau * Eva = new Frau("Eva"); Mann * Kain = new Mann("Kain"); Kain->SetzeMutter(Eva); Kain->SetzeVater(Adam); Mann * Abel = new Mann("Abel"); Abel->SetzeMutter(Eva); Abel->SetzeVater(Adam); Adam->Druck("Zu Adam: "); Eva->Druck("\nZu Eva:"); Kain->Druck("\n\nAngaben zu Kain:"); Abel->Druck("\n\nAngaben zu Abel:"); Verheirate(Adam, Eva); cout << "\nverheiratet?\n"; Eva->EhefrauVon()-> Druck("\tEva ist verheiratet mit:\n"); Adam->EhemannVon()-> Druck("\tAdam ist verheiratet mit :\n "); return 0;} Mann-Frau

15-44 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung Mann-Frau : Ausgabe Zu Adam: (Vorname) Adam Zu Eva:(Vorname) Eva Angaben zu Kain: (Vorname) Kain Daten der Mutter: (Vorname) Eva Daten des Vaters: (Vorname) Adam Angaben zu Abel: (Vorname) Abel Daten der Mutter: (Vorname) Eva Daten des Vaters: (Vorname) Adam verheiratet? Eva ist verheiratet mit: (Vorname) Adam Adam ist verheiratet mit: (Vorname) Eva (umformatiert: GD )

15-45 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung // Personen mit Unterklassen // Vorlage EED EINI II, SS 99, prog-27a; // Überarbeitet: GD // demonstriert Vererbung // #include #include "clstring.h" class Mann; class Frau; void Verheirate(Mann *, Frau *);

15-46 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung // Personen mit Unterklassen, Fortsetzung 1 class Person { private: stringcl * Vorname; Frau * Mutter; Mann * Vater; public: Person(char *); Person(stringcl *); ~Person(); stringcl * DerVorname(); void SetzeMutter(Frau *); void SetzeVater(Mann *); void Druck(char *); };

15-47 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung // Personen mit Unterklassen, Fortsetzung 2 class Frau: public Person { private: Mann * Ehemann; public: Frau(char *); Frau (Person *); void NimmZumManne(Mann *); Mann * EhefrauVon();}; class Mann: public Person { private: Frau * Ehefrau; public: Mann(char *); Mann (Person *); void NimmZurFrau(Frau *); Frau * EhemannVon();};

15-48 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung // Personen mit Unterklassen, Fortsetzung 3 Person::Person(char * v) { Vorname = new stringcl(v); Vater = NULL; Mutter = NULL;} Person::Person(stringcl * s) { Vorname = s; Vater = NULL; Mutter = NULL;} Person::~Person() { Vorname->~stringcl();} stringcl * Person::DerVorname() { return Vorname;} void Person::SetzeMutter(Frau * Mom) { Mutter = Mom;} void Person::SetzeVater(Mann * Dad) { Vater = Dad;}

15-49 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung // Personen mit Unterklassen, Fortsetzung 4 void Person::Druck(char * s) { cout << s << "\t(Vorname) " dieKette() << endl; if(Mutter != NULL) { cout << "\nDaten der Mutter: " << endl; Mutter->Druck("");} if(Vater != NULL) { cout << "\nDaten des Vaters: " << endl; Vater->Druck("");}}; Frau::Frau(char * v) :Person(v) { Ehemann = NULL;} Frau::Frau(Person *p) :Person(p->DerVorname()){ Ehemann = NULL;}

15-50 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung // Personen mit Unterklassen, Fortsetzung 5 void Frau::NimmZumManne(Mann * erDa) { Ehemann = erDa;} Mann * Frau::EhefrauVon(){ return Ehemann;} Mann::Mann(char * v) :Person(v) { Ehefrau = NULL;} Mann::Mann(Person *p) :Person(p->DerVorname()){ Ehefrau = NULL;} void Mann::NimmZurFrau(Frau * thisLady) { Ehefrau = thisLady;}

15-51 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung // Personen mit Unterklassen, Fortsetzung 6 Frau * Mann::EhemannVon(){ return Ehefrau;} void Verheirate(Mann * m, Frau * f){ m->NimmZurFrau(f); f->NimmZumManne(m); } int main() { Mann * Adam = new Mann("Adam"); Frau * Eva = new Frau("Eva"); Mann * Kain = new Mann("Kain"); Kain->SetzeMutter(Eva); Kain->SetzeVater(Adam);

15-52 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung // Personen mit Unterklassen, Fortsetzung 7 //int main() {Fortsetzung !!!! Mann * Abel = new Mann("Abel"); Abel->SetzeMutter(Eva); Abel->SetzeVater(Adam); Adam->Druck("Zu Adam: "); Eva->Druck("\nZu Eva:"); Kain->Druck("\n\nAngaben zu Kain:"); Abel->Druck("\n\nAngaben zu Abel:"); Verheirate(Adam, Eva); cout << "\nverheiratet?\n"; Eva->EhefrauVon()->Druck("\tEva ist verheiratet mit: \n"); Adam->EhemannVon()->Druck("\tAdam ist verheiratet mit: \n"); return 0; }

15-53 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung // Hilfsklasse stringcl in Datei "clstring.h" // Vorlage EED EINI II SS99, // überarbeitet GD void strcpy(char * nach, char * von); int strlen(char * r); bool islower(char c); char toupper(char c); void strcpy(char * nach, char * von) { while (*nach++ = *von++);} int strlen(char * r) { int f = 0; while (r[f++]); return f;}

15-54 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung // Hilfsklasse stringcl, Fortsetzung 1 bool islower(char c) { if (('a' <= c) && (c <= 'z')) return true; else return false; } char toupper(char c) { if (islower(c)) return (c - 'a' + 'A'); else return c; }

15-55 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung // Hilfsklasse stringcl, Fortsetzung 2 class stringcl { protected: char * s; int laenge; public: stringcl(char *); ~stringcl(); bool lies(char *); void schreib(); char * dieKette(); int DieLaenge(); };

15-56 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung // Hilfsklasse stringcl, Fortsetzung 3 stringcl::stringcl (char *t) { int lgth = strlen(t); s = new char[lgth+1]; strcpy(s, t); laenge = --lgth;} stringcl::~stringcl() { laenge = -1; delete &s;} bool stringcl::lies(char * r) { int strlen(char *); if (strlen(r) <= laenge) { laenge = strlen(r); strcpy(s, r); return true;} elsereturn false;}

15-57 Prof. Dr. G. Dittrich EINI II Kap. 15: Einführung in die Vererbung // Hilfsklasse stringcl, Fortsetzung 4 void stringcl::schreib() { cout << s << endl; } char * stringcl::dieKette() { return s;} int stringcl::DieLaenge() { return laenge;}