Präsentation herunterladen
Die Präsentation wird geladen. Bitte warten
Veröffentlicht von:Hannah Lang Geändert vor über 8 Jahren
1
Erweiterte Zuweisungskompatibilität
2
Wie kann man Objekte verschiedener Klassen einer Klassenhierarchie einander zuweisen ?
3
Beispiel:
4
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 !
5
kurz: A B
6
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
7
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.
8
Erzeugen Sie zu der UML-Darstellung den Programmcode in C++, wobei:
9
hallo() aus der Klasse A "Ich bin A", hallo() aus der Klasse B "Ich bin B" auf dem Bildschirm ausgibt.
10
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.
11
Das Programm
12
#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; };
13
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; };
14
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
15
a x10 a = b; b A::x18 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von a nach der Zuweisung ?
16
a x10 a = b; b A::x18 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von a nach der Zuweisung ? 18
17
a x10 a = b; b A::x18 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von a nach der Zuweisung ? 18
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
19
a x10 a = b; b A::x18 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von a nach der Zuweisung ? 18
20
a x10 a = b; b A::x18 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von a nach der Zuweisung ? 18
21
a x10 a = b; b A::x18 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von a nach der Zuweisung ? 18
22
a x10 a = b; b A::x18 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von a nach der Zuweisung ? 18
23
a x10 a = b; b A::x18 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von a nach der Zuweisung ? 18
24
a x10 a = b; b A::x18 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von a nach der Zuweisung ? 18
25
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
26
Neue Frage
27
a x10 b = a; b A::x18 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von b nach der Zuweisung ?
28
a x10 b = a; b A::x18 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von b nach der Zuweisung ? 10
29
a x b = a; b A::x18 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von b nach der Zuweisung ? 10
30
a x b = a; b A::x18 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von b nach der Zuweisung ? 10
31
a x b = a; b A::x18 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von b nach der Zuweisung ? 10
32
a x b = a; b A::x18 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von b nach der Zuweisung ? 10
33
a x b = a; b A::x18 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von b nach der Zuweisung ? 10
34
a x b = a; b A::x18 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von b nach der Zuweisung ? 10
35
a x b = a; b A::x18 x19 y20 Was bewirkt folgende Anweisung ? Welche Werte haben die Datenmember von b nach der Zuweisung ? 10
36
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 !!
37
a = b; b = a; Kurze Merkregel: richtig: "Oberklasse = Unterklasse" falsch: "Unterklasse = Oberklasse " Kurz zusammengefasst gilt also: a x10 b A::x10 x19 y20
38
Neue Frage
39
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?
40
ap = &a; bp = &b; ap = bp; Adr a 0100x10 Adr b 0200A::x18 x19 y20 Adr ap 0300
41
ap nach der Zuweisung ap = &a; bp = &b; ap = bp; Adr ap 03000200 Adr b 0200A::x18 x19 y20 Adr a 0100x10
42
ap = &a; bp = &b; ap = bp; Adr ap 03000200 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
43
ap = &a; bp = &b; ap = bp; Adr ap 03000200 Adr b 0200A::x x19 y20 Adr a 0100x10 ap->x=13;
44
ap = &a; bp = &b; ap = bp; Adr ap 03000200 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.
45
Neue Frage
46
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
47
ap = &a; bp = &b; Adr a 0100x10 Adr b 0200A::x18 x19 y20 Adr ap 0300
48
ap = &a; bp = &b; Adr a 0100x10 Adr b 0200A::x18 x19 y20 Adr ap 03000100
49
ap = &a; bp = &b; Adr a 0100x10 Adr b 0200A::x18 x19 y20 Adr ap 03000100 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;
50
Neue Frage
51
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?
52
ap = &a; bp = &b; bp = ap; Adr a 0100x10 Adr b 0200A::x18 x19 y20 Adr bp 0400
53
ap = &a; bp = &b; bp = ap; Adr a 0100x10 Adr b 0200A::x18 x19 y20 Adr bp 04000100 bp nach der Zuweisung
54
ap = &a; bp = &b; bp = ap; Adr a 0100x10 Adr b 0200A::x18 x19 y20 Adr bp 04000100 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.
55
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
Ähnliche Präsentationen
© 2024 SlidePlayer.org Inc.
All rights reserved.