55
Erweiterte Zuweisungskompatib ilität

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

Embed Size (px)

Citation preview

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

Erweiterte Zuweisungskompatibilität

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

Wie kann man Objekte verschiedener Klassen einer Klassenhierarchie einander zuweisen ?

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

Beispiel:

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

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 !

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

kurz:

A

B

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

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

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

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.

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

Erzeugen Sie zu der UML-Darstellung den

Programmcode in C++, wobei:

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

hallo() aus der Klasse A "Ich bin A",

hallo() aus der Klasse B "Ich bin B"

auf dem Bildschirm ausgibt.

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

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.

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

Das Programm

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

#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;};

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

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;};

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

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

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

ax 10

a = b;

bA::x 18x 19y 20

Was bewirkt folgende Anweisung ?Welche Werte haben die Datenmember von a nach der Zuweisung ?

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

ax 10

a = b;

bA::x 18x 19y 20

Was bewirkt folgende Anweisung ?Welche Werte haben die Datenmember von a nach der Zuweisung ?

18

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

ax 10

a = b;

bA::x 18x 19y 20

Was bewirkt folgende Anweisung ?Welche Werte haben die Datenmember von a nach der Zuweisung ?

18

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

ax 10

a = b;

bA::x 18x 19y 20

Was bewirkt folgende Anweisung ?Welche Werte haben die Datenmember von a nach der Zuweisung ?

18

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

ax 10

a = b;

bA::x 18x 19y 20

Was bewirkt folgende Anweisung ?Welche Werte haben die Datenmember von a nach der Zuweisung ?

18

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

ax 10

a = b;

bA::x 18x 19y 20

Was bewirkt folgende Anweisung ?Welche Werte haben die Datenmember von a nach der Zuweisung ?

18

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

ax 10

a = b;

bA::x 18x 19y 20

Was bewirkt folgende Anweisung ?Welche Werte haben die Datenmember von a nach der Zuweisung ?

18

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

ax 10

a = b;

bA::x 18x 19y 20

Was bewirkt folgende Anweisung ?Welche Werte haben die Datenmember von a nach der Zuweisung ?

18

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

ax 10

a = b;

bA::x 18x 19y 20

Was bewirkt folgende Anweisung ?Welche Werte haben die Datenmember von a nach der Zuweisung ?

18

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

ax 10

a = b;

bA::x 18x 19y 20

Was bewirkt folgende Anweisung ?Welche Werte haben die Datenmember von a nach der Zuweisung ?

18

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

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

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

Neue Frage

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

ax 10

b = a;

bA::x 18x 19y 20

Was bewirkt folgende Anweisung ?Welche Werte haben die Datenmember von b nach der Zuweisung ?

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

ax 10

b = a;

bA::x 18x 19y 20

Was bewirkt folgende Anweisung ?Welche Werte haben die Datenmember von b nach der Zuweisung ?

10

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

ax 10

b = a;

bA::x 18x 19y 20

Was bewirkt folgende Anweisung ?Welche Werte haben die Datenmember von b nach der Zuweisung ?

10

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

ax 10

b = a;

bA::x 18x 19y 20

Was bewirkt folgende Anweisung ?Welche Werte haben die Datenmember von b nach der Zuweisung ?

10

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

ax 10

b = a;

bA::x 18x 19y 20

Was bewirkt folgende Anweisung ?Welche Werte haben die Datenmember von b nach der Zuweisung ?

10

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

ax 10

b = a;

bA::x 18x 19y 20

Was bewirkt folgende Anweisung ?Welche Werte haben die Datenmember von b nach der Zuweisung ?

10

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

ax 10

b = a;

bA::x 18x 19y 20

Was bewirkt folgende Anweisung ?Welche Werte haben die Datenmember von b nach der Zuweisung ?

10

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

ax 10

b = a;

bA::x 18x 19y 20

Was bewirkt folgende Anweisung ?Welche Werte haben die Datenmember von b nach der Zuweisung ?

10

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

ax 10

b = a;

bA::x 18x 19y 20

Was bewirkt folgende Anweisung ?Welche Werte haben die Datenmember von b nach der Zuweisung ?

10

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

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 !!

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

a = b;b = a;

Kurze Merkregel: richtig:"Oberklasse = Unterklasse"falsch: "Unterklasse = Oberklasse "

Kurz zusammengefasst gilt also:

ax 10

bA::x 10x 19y 20

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

Neue Frage

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

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 ?

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

ap = &a;bp = &b;ap = bp;

Adr a0100 x 10

Adr b0200 A::x 18

x 19y 20Adr ap

0300

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

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

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

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

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

ap = &a;bp = &b;ap = bp;

Adr ap0300 0200

Adr b0200 A::x

x 19y 20

Adr a0100 x 10

ap->x=13;

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

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.

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

Neue Frage

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

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

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

ap = &a;bp = &b;

Adr a0100 x 10

Adr b0200 A::x 18

x 19y 20Adr ap

0300

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

ap = &a;bp = &b;

Adr a0100 x 10

Adr b0200 A::x 18

x 19y 20Adr ap

0300 0100

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

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;

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

Neue Frage

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

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 ?

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

ap = &a;bp = &b;bp = ap;

Adr a0100 x 10

Adr b0200 A::x 18

x 19y 20Adr bp

0400

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

ap = &a;bp = &b;bp = ap;

Adr a0100 x 10

Adr b0200 A::x 18

x 19y 20Adr bp

0400 0100bp nach der Zuweisung

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

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.

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

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