N
Danke erstmal für's durchlesen!
CStoll schrieb:
O1 = rO; // zunächst wird Ober::operator=() aufgerufen,
// der ruft assign(rO) auf und weil assign virtuell ist, wird
// Unter::assign() aufgerufen. Das liefert Unter& zurück und
// ich habe wieder den Fall O1 = U1. Ist das korrekt?
// Weitere Frage: was ist in diesem Fall this? Das temporäre Objekt,
// das in return assign(rs) steckt?
Nein, das ruft Ober::assign(r0) auf (wichtig ist hierfür der Typ links vom Gleichheitszeichen)
Ok, verstehe ich: links des Gleichheitszeichens steht ein "Ober" deshalb zuerst Aufruf Ober::operator=(rO), innerhalb der Methode dann Ober::assign(rO), d.h. die zusätzlichen Attribute von "Unter" gehen wie im Fall O1=U1 verloren.
CStoll schrieb:
U1 = rO; // es wird Unter::operator=() augerufen und wenn die vorherige
// Zuweisung korrekt beschrieben war, ist mir diese auch klar ;-)
Das dürfte genauso in die Hose gehen wie "U1=O1;" (ob es möglich ist, entscheiden die statischen Typen der Objekte).
Das heißt, hier scheitert bereits der Aufruf von Unter::operator=(rO), weil ein "Unter" als Übergabe erwartet, aber (statisch gesehen) ein "Ober" übergeben wird, sodass assign(rO) gar nicht erst aufgerufen wird??
CStoll schrieb:
btw, interessanter dürfte die Zuweisung "rO=O1;" sein - hier greift das virtual und du rufst Unter::assign mit einem echten Ober-Objekt auf -> Crash (bzw. Exception im dynamic_cast).
Das klingt logisch! D.h. die vom Autor des Buches angegebene Lösung einer Zuweisung, die auch für polymorphe Objekte funktioniert, ist ziemlicher Blödsinn, weil sie für die beiden Fälle
U1=rO;
rO=O1;
nicht funktioniert und die virtuelle Funktion assign eigetnlich überhaupt keinen Nutzen hat...
Vielleicht sollte ich mich nach einem anderen Buch umschauen...