Upload
hannah-lang
View
217
Download
0
Embed Size (px)
Citation preview
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
AA::x
BA::xB::xB::y
A besteht also aus folgenden Datenmembern
B besteht also aus folgenden Datenmembern
A::x bezeichnet das von der Oberklasse vererbte Attribut x
Ax
BA::xxy
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 <iostream>#include <time.h>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
ax 10
a = b;
bA::x 18x 19y 20
Was bewirkt folgende Anweisung ?Welche Werte haben die Datenmember von a nach der Zuweisung ?
ax 10
a = b;
bA::x 18x 19y 20
Was bewirkt folgende Anweisung ?Welche Werte haben die Datenmember von a nach der Zuweisung ?
18
ax 10
a = b;
bA::x 18x 19y 20
Was bewirkt folgende Anweisung ?Welche Werte haben die Datenmember von a nach der Zuweisung ?
18
ax 10
a = b;
bA::x 18x 19y 20
Was bewirkt folgende Anweisung ?Welche Werte haben die Datenmember von a nach der Zuweisung ?
18
ax 10
a = b;
bA::x 18x 19y 20
Was bewirkt folgende Anweisung ?Welche Werte haben die Datenmember von a nach der Zuweisung ?
18
ax 10
a = b;
bA::x 18x 19y 20
Was bewirkt folgende Anweisung ?Welche Werte haben die Datenmember von a nach der Zuweisung ?
18
ax 10
a = b;
bA::x 18x 19y 20
Was bewirkt folgende Anweisung ?Welche Werte haben die Datenmember von a nach der Zuweisung ?
18
ax 10
a = b;
bA::x 18x 19y 20
Was bewirkt folgende Anweisung ?Welche Werte haben die Datenmember von a nach der Zuweisung ?
18
ax 10
a = b;
bA::x 18x 19y 20
Was bewirkt folgende Anweisung ?Welche Werte haben die Datenmember von a nach der Zuweisung ?
18
ax 10
a = b;
bA::x 18x 19y 20
Was bewirkt folgende Anweisung ?Welche Werte haben die Datenmember von a nach der Zuweisung ?
18
ax 18
a = b;
bA::x 18x 19y 20
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
ax 10
b = a;
bA::x 18x 19y 20
Was bewirkt folgende Anweisung ?Welche Werte haben die Datenmember von b nach der Zuweisung ?
ax 10
b = a;
bA::x 18x 19y 20
Was bewirkt folgende Anweisung ?Welche Werte haben die Datenmember von b nach der Zuweisung ?
10
ax 10
b = a;
bA::x 18x 19y 20
Was bewirkt folgende Anweisung ?Welche Werte haben die Datenmember von b nach der Zuweisung ?
10
ax 10
b = a;
bA::x 18x 19y 20
Was bewirkt folgende Anweisung ?Welche Werte haben die Datenmember von b nach der Zuweisung ?
10
ax 10
b = a;
bA::x 18x 19y 20
Was bewirkt folgende Anweisung ?Welche Werte haben die Datenmember von b nach der Zuweisung ?
10
ax 10
b = a;
bA::x 18x 19y 20
Was bewirkt folgende Anweisung ?Welche Werte haben die Datenmember von b nach der Zuweisung ?
10
ax 10
b = a;
bA::x 18x 19y 20
Was bewirkt folgende Anweisung ?Welche Werte haben die Datenmember von b nach der Zuweisung ?
10
ax 10
b = a;
bA::x 18x 19y 20
Was bewirkt folgende Anweisung ?Welche Werte haben die Datenmember von b nach der Zuweisung ?
10
ax 10
b = a;
bA::x 18x 19y 20
Was bewirkt folgende Anweisung ?Welche Werte haben die Datenmember von b nach der Zuweisung ?
10
ax 10
b = a;
bA::x 10x 19y 20
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:
ax 10
bA::x 10x 19y 20
Neue Frage
ap = &a;bp = &b;ap = bp;
Adr a0100 x 10
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 a0200 sei die Adresse von b0300 sei die Adresse von ap
Adr b0200 A::x 18
x 19y 20Adr ap
0300 ?
ap = &a;bp = &b;ap = bp;
Adr a0100 x 10
Adr b0200 A::x 18
x 19y 20Adr ap
0300
ap nach der Zuweisung
ap = &a;bp = &b;ap = bp;
Adr ap0300 0200
Adr b0200 A::x 18
x 19y 20
Adr a0100 x 10
ap = &a;bp = &b;ap = bp;
Adr ap0300 0200
Adr b0200 A::x 18
x 19y 20
Adr a0100 x 10
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 ap0300 0200
Adr b0200 A::x
x 19y 20
Adr a0100 x 10
ap->x=13;
ap = &a;bp = &b;ap = bp;
Adr ap0300 0200
Adr b0200 A::x
x 19y 20
Adr a0100 x 10
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 a0100 x 10
Adr b0200 A::x 18
x 19y 20Adr 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 a0100 x 10
Adr b0200 A::x 18
x 19y 20Adr ap
0300
ap = &a;bp = &b;
Adr a0100 x 10
Adr b0200 A::x 18
x 19y 20Adr ap
0300 0100
ap = &a;bp = &b;
Adr a0100 x 10
Adr b0200 A::x 18
x 19y 20Adr ap
0300 0100
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 a0100 x 10
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 a0200 sei die Adresse von b0400 sei die Adresse von bp
Adr b0200 A::x 18
x 19y 20Adr bp
0400 ?
ap = &a;bp = &b;bp = ap;
Adr a0100 x 10
Adr b0200 A::x 18
x 19y 20Adr bp
0400
ap = &a;bp = &b;bp = ap;
Adr a0100 x 10
Adr b0200 A::x 18
x 19y 20Adr bp
0400 0100bp nach der Zuweisung
ap = &a;bp = &b;bp = ap;
Adr a0100 x 10
Adr b0200 A::x 18
x 19y 20Adr bp
0400 0100Welcher 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:
ax 10
bA::x 18x 19y 20