catch(CC& a) statt catch(CC a)
-
Hallo alle!
Ich habe da eine Verständnissfrage: Ich werfe einstd::out_of_rang("foo bar")
und muss es mit
catch(std::exception& e)
fangen damit ich
std::cout<<e.what()
machen kann.
Wenn ich mit
catch(std::exception e)
fange sollte das Objekt doch lediglich kopiert werden und alles bleibt beim alten. Bei
std::cout<<e.what()
bekomme ich dann aber St9exception.
Was ist das Problem? Haut das kopieren bei Exceptions nicht hin, oder funktioniert die Polymorphiegeschichte nicht wenn ich das Objekt erst kopieren lasse?
Vielen Dank!
Bis dann...
Peanut
-
Polymorphie funktioniert nur mit Referenzen und Zeigern.
-
Hallo,
du wurdest Opfer des berühmt berüchtigten Object-Slicings.Wenn du eine Exception by value fängst, dann wird die Exception *kopiert*.
Kopieren passiert in C++ über den Copy-Konstruktor. In diesem Fall wird der Copy-Ctor von std::exception aufgerufen. Dieser initialisiert aber natürlich auch nur ein Objekt vom Typ std::exception.Bei diesem Kopiervorgang wird in diesem Fall also nur der Basisklassenanteil der geworfenen Exception kopiert und übernommen. Du hast danach eine Exception vom Typ std::exception. Und zwar wirklich von diesem Typ. Von dem abgeleiteten Teil ist *nichts* mehr übrig. Weg. Abgeschnitten.
Deshalb merke:
Regel Nr. 27 für das Hantieren mit Exceptions in C++:
"Throw by value, catch by reference".