Erweiterte Zuweisungskompatibilität. Wie kann man Objekte verschiedener Klassen einer Klassenhierarchie einander zuweisen ?

Slides:



Advertisements
Ähnliche Präsentationen
Programme in C++.
Advertisements

Objektorientierte Programmierung
Konzepte objektorientierter Systeme
Kapselung , toString , equals , Java API
Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Donnerstag Andreas Döring SS 2004.
Java: Objektorientierte Programmierung
Indirekte Adressierung
Java: Grundlagen der Objektorientierung
Vererbung.
Algorithmus. Ein Kochrezept, zum Beispiel: Kartoffelbrei.
Abstrakte Klassen.
Klassenvariable (auch Klassendaten bzw. statische Attribute genannt) und statische Methoden.
Dateien. Eine Datei wird in C++ als ein Stream, also als ein Objekt einer bestimmten Klasse dargestellt.
ARRAY oder FELD oder VEKTOR
Ein Beispiel in Java.
Erweiterte Zuweisungskompatibilität
Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,
Konstruktoren.
Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen...
Parameterübergabe von zweidimensionalen Feldern in Funktionen.
Vererbung. Das Prinzip der Vererbung im täglichen Leben:
Polymorphie (Vielgestaltigkeit)
Assoziationen (Beziehungen). Zwischen Objekten kann es eine Beziehung geben.
Polymorphie (Vielgestaltigkeit)
Objekte und Arbeitsspeicher
V AdresseWert public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher.
Interface bzw. Schnittstelle anschaulich: Hüllenklasse
FOR Anweisung. Aufgabe : Ausgabe aller ganzen Zahlen von 0 bis 100 auf dem Bildschirm.
Dynamischer Speicher. In einer Funktion wird z.B. mit der Deklaration int i; Speicher auf dem sogenannten Stack reserviert. Wenn die Funktion verlassen.
DO...WHILE Anweisung.
ARRAY oder FELD oder VEKTOR
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.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Java-Kurs - 7. Übung Besprechung der Hausaufgabe Referenzvariablen
PKJ 2005/1 Stefan Dissmann Ausblick Es fehlen noch: Möglichkeiten zum Strukturieren größerer Programme Umgang mit variabler Zahl von Elementen Umgang mit.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Programm besteht aus mehreren Bestandteilen: Schlüsselwörter Sonderzeichen Bezeichner Kommentare Texte.
Abstrakter Datentyp in C++ I - Klasse -
C++ Vererbung und Polymorphie
DVG Klassen und Objekte
Informatik Grundlagen, WS04, Seminar 11
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.
Informatik 1 Letzte Übung.
Dynamische Datentypen
Variablenkonzept Klassisch, in Java Basistyp
Grundlagen wissenschaftlichen Arbeitens An Overview of C++ Ali CICEK
Klassenhierarchien, Vererbung
Polymorphie (Vielgestaltigkeit). Wenn eine Methode, wie z.B. print für verschiedene Programmteile steht (und z.B. einmal Objekte verschiedener Klassen.
early binding (frühe Bindung) late binding (späte Bindung)
Java-Kurs Übung Besprechung der Hausaufgabe
Einführung in die Programmierung mit Java 5. Vorlesung WS 2002/2003 Institut für Kartographie und Geoinformation Prof.-Dr. Lutz Plümer, Dr. Gerhard Gröger,
Funktionen. Aufgabe : Eingabe zweier Zahlen ---> Minimum bestimmen Dann nochmals Eingabe zweier Zahlen ---> Minimum bestimmen.
Pointer. Grundsätzliches: Im Arbeitsspeicher werden Daten gespeichert. Um auf die Daten eindeutig zugreifen zu können, werden diesen Daten Adressen zugeordnet.
Funktionen, Felder und Parameter- übergabe. Funktionsaufruf mit Feld als Parameter: Parameter = Name des Feldes.
Namensräume (namespaces). verwendet man umfangreiche eigene und fremde Bibliotheken (Sammlungen von Funktionen) so ist die Wahrscheinlichkeit groß, daß.
Tutorium Software-Engineering SS14 Florian Manghofer.
Java Programme nur ein bisschen objektorientiert.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
Funktionen (Zweck und Eigenschaften) Funktionen sind Unterprogramme, die einen bestimmten Zweck erfüllen Sie zerlegen Probleme in kleine, abgeschlossene.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
Konstruktoren.
Referenzen In c kennen wir gewöhnliche Variablen und Pointer.
Zufallszahlen in C erzeugen
 Präsentation transkript:

Erweiterte Zuweisungskompatibilität

Wie kann man Objekte verschiedener Klassen einer Klassenhierarchie einander zuweisen ?

Beispiel:

A + x: int + A(int i) + hallo():void B ist Subklasse von A A ist die Basisklasse B + x: int + y: int + B(int i) + hallo():void Welchen Nachteil hat dieses Design ? Die Attribute sind public ! Dies wird hier nur aus Gründen der Vereinfachung gemacht !

kurz: A B

A A::x B B::x B::y A besteht also aus folgenden Datenmembern B besteht also aus folgenden Datenmembern A::x bezeichnet das von der Oberklasse vererbte Attribut x

A x B A::x x y Wenn es klar ist, zu welcher Klasse ein Klassenmember gehört, kann man die Angabe der Klasse auch weglassen !! Geben Sie die Klassen A und B unter Vermeidung überflüssiger Angaben an.

Erzeugen Sie zu der UML-Darstellung den Programmcode in C++, wobei:

hallo() aus der Klasse A "Ich bin A", hallo() aus der Klasse B "Ich bin B" auf dem Bildschirm ausgibt.

und z.B: a(10) das Attribut a.x auf 10 setzt, b(20) die Attribute b.y auf 20, b.x auf 19 und b.A::x auf 18 setzt.

Das Programm

#include "stdafx.h" #include using namespace std; class A{ public: A(int i); void hallo(); int x; }; class B: public A{ public: B(int i); void hallo(); int x; int y; };

A::A(int i){ x = i; }; void A::hallo(){ cout << "Ich bin A" << "x=" << x << endl; }; B::B(int i):A(i-2){ x = i-1; y = i; }; void B::hallo(){ cout << "Ich bin B" << "x=" << x << "y=" << y << endl; };

int main(){ A a(10); B b(20); A *ap; B *bp; Welche Werte haben: a.x = 10 b.A::x = 18 b.x = 19 b.y = 20

a x10 a = b; b A::x18 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von a nach der Zuweisung ?

a x10 a = b; b A::x18 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von a nach der Zuweisung ? 18

a x10 a = b; b A::x18 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von a nach der Zuweisung ? 18

a x10 a = b; b A::x18 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von a nach der Zuweisung ? 18

a x10 a = b; b A::x18 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von a nach der Zuweisung ? 18

a x10 a = b; b A::x18 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von a nach der Zuweisung ? 18

a x10 a = b; b A::x18 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von a nach der Zuweisung ? 18

a x10 a = b; b A::x18 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von a nach der Zuweisung ? 18

a x10 a = b; b A::x18 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von a nach der Zuweisung ? 18

a x10 a = b; b A::x18 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von a nach der Zuweisung ? 18

a x a = b; b A::x18 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von a nach der Zuweisung ? Die Speicherzellen x (genauer: B::x) und y kommen im Objekt a der Klasse A nicht vor. Deswegen können sie auch nicht kopiert werden. Man könnte sagen sie werden ins “Nichts“ kopiert

Neue Frage

a x10 b = a; b A::x18 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von b nach der Zuweisung ?

a x10 b = a; b A::x18 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von b nach der Zuweisung ? 10

a x b = a; b A::x18 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von b nach der Zuweisung ? 10

a x b = a; b A::x18 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von b nach der Zuweisung ? 10

a x b = a; b A::x18 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von b nach der Zuweisung ? 10

a x b = a; b A::x18 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von b nach der Zuweisung ? 10

a x b = a; b A::x18 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von b nach der Zuweisung ? 10

a x b = a; b A::x18 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von b nach der Zuweisung ? 10

a x b = a; b A::x18 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von b nach der Zuweisung ? 10

a x b = a; b A::x10 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von b nach der Zuweisung ? Diese Anweisung bewirkt einen Compilerfehler, weil nach dieser Anweisung die Werte von x und y des Objekts b nicht gesetzt werden und deswegen im schlimmsten Fall undefiniert sein könnten. Dies soll unbedingt vermieden werden !!

a = b; b = a; Kurze Merkregel: richtig: "Oberklasse = Unterklasse" falsch: "Unterklasse = Oberklasse " Kurz zusammengefasst gilt also: a x10 b A::x10 x19 y20

Neue Frage

ap = &a; bp = &b; ap = bp; Adr a 0100x10 Welchen Wert hat der Inhalt der Speicherzelle ap nach den Zuweisungen links ? Auf welches Objekt zeigt also ap ? ap vor der Zuweisung 0100 sei die Adresse von a 0200 sei die Adresse von b 0300 sei die Adresse von ap Adr b 0200A::x18 x19 y20 Adr ap 0300?

ap = &a; bp = &b; ap = bp; Adr a 0100x10 Adr b 0200A::x18 x19 y20 Adr ap 0300

ap nach der Zuweisung ap = &a; bp = &b; ap = bp; Adr ap Adr b 0200A::x18 x19 y20 Adr a 0100x10

ap = &a; bp = &b; ap = bp; Adr ap Adr b 0200A::x18 x19 y20 Adr a 0100x10 Welcher Wert welcher Speicherzelle wird durch die gleich folgende Anweisung links verändert ? ap->x=13; Wiederholung: ap->x=13 ist gleichbedeutend mit: (*ap).x=13 (*ap).x=13; 0200

ap = &a; bp = &b; ap = bp; Adr ap Adr b 0200A::x x19 y20 Adr a 0100x10 ap->x=13;

ap = &a; bp = &b; ap = bp; Adr ap Adr b 0200A::x x19 y20 Adr a 0100x10 ap->x=13; 13 Warum wird NICHT b.x (also 19), sondern b.A::x (also18) verändert? Antwort: siehe später.

Neue Frage

ap = &a; bp = &b; Adr a 0100x10 Adr b 0200A::x18 x19 y20 Adr ap 0300? Welchen Wert hat der Inhalt der Speicherzelle ap nach den Zuweisungen links ? Auf welches Objekt zeigt also ap ? ap vor der Zuweisung

ap = &a; bp = &b; Adr a 0100x10 Adr b 0200A::x18 x19 y20 Adr ap 0300

ap = &a; bp = &b; Adr a 0100x10 Adr b 0200A::x18 x19 y20 Adr ap

ap = &a; bp = &b; Adr a 0100x10 Adr b 0200A::x18 x19 y20 Adr ap Welcher Wert welcher Speicherzelle wird durch die gleich folgende Anweisung links verändert ? Diese Anweisung würde einen Zugriff außerhalb des Objekts a bewirken. Anweisung erzeugt Compilerfehler, weil der Typ von ap ein Pointer auf A ist und A kein Datenmitglied y kennt. ap->y=15;

Neue Frage

ap = &a; bp = &b; bp = ap; Adr a 0100x10 Welchen Wert hat der Inhalt der Speicherzelle bp nach den Zuweisungen links ? Auf welches Objekt zeigt also bp ? bp vor der Zuweisung 0100 sei die Adresse von a 0200 sei die Adresse von b 0400 sei die Adresse von bp Adr b 0200A::x18 x19 y20 Adr bp 0400?

ap = &a; bp = &b; bp = ap; Adr a 0100x10 Adr b 0200A::x18 x19 y20 Adr bp 0400

ap = &a; bp = &b; bp = ap; Adr a 0100x10 Adr b 0200A::x18 x19 y20 Adr bp bp nach der Zuweisung

ap = &a; bp = &b; bp = ap; Adr a 0100x10 Adr b 0200A::x18 x19 y20 Adr bp Welcher Wert welcher Speicherzelle wird durch die gleich folgende Anweisung links verändert ? bp->y=15; Diese Anweisung würde einen Zugriff außerhalb des Objekts a bewirken. Anweisung erzeugt Compilerfehler, weil der Datentyp von bp zwar einerseits das Datenmitglied y kennt und deshalb den Zugriff darauf zulassen müsste, aber andererseits bp auf ein Objekt zeigen kann (wie hier: auf A), das dieses Datenmitglied y nicht kennt. Dies ist ein Widerspruch.

bp = ap; ap = bp; Kurze Merkregel: richtig: "Pointer Oberklasse = Pointer Unterklasse" falsch "Pointer Unterklasse = Pointer Oberklasse" Kurz zusammengefasst gilt also: a x10 b A::x18 x19 y20