Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

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

Ähnliche Präsentationen


Präsentation zum Thema: "Erweiterte Zuweisungskompatibilität. Wie kann man Objekte verschiedener Klassen einer Klassenhierarchie einander zuweisen ?"—  Präsentation transkript:

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


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

Ähnliche Präsentationen


Google-Anzeigen