PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Vererbung und Virtual Functions


Che
2003-07-09, 20:00:09
Hi mal wieder!

An diese Sachen hab ich mich also auch herangewagt und auch schon die ersten Fragen dazu :)

Ich habe eine Klasse Exception und eine davon abgleitete, ExDivByZero. (Jaja, das Anfängerbeispiel...) Mit einer virtuellen Funktion display, die jeweils die Fehlermeldung ausgibt und den Namen der Klasse, damit man die zwei virtuellen auseinanderkennt.

Eine schöne Tesfunktion habe ich auch, dabei wird ein int x durch einen int y dividiert. (Ist das nicht schön? ;):D)
Exception wird geworfen wenn y==5, ExDivByZero natürlich wenn y==0.

In main wird gefangen:

catch (CException ex)
{
ex.display();
}

Hier erscheint bei Display immer Eception als Klassenname.


catch (CException &ex)
{
ex.display();
}

Hier erscheint bei y==0 ExDivByZero als Klassenname, sonst Exception.

Warum dieses? Was hat die Art und Weise wie ich fange (als Referenz oder nicht) damit zu tun? Meine Vermutung: Ohne Referenz ist so wie Call-by-Value: Ein neues Exception Objekt wird angelegt, welches natürlich IMMER vom Typ Exception ist. Und was passiert dann mit Referenz?

Ich bin sehr daran interessiert was hier im Hintergrund abläuft.

MfG

Demirug
2003-07-09, 21:16:37
Beim werfen einer Exception wird zuerst einmal ein Object vom entsprechenden Typ angelegt.

Wird nun beim Hochlaufen des Stacks ein Catchblock gefunden wir geprüft ob dieser kompatibel zu der geworfenen Exception ist.

Fängt man die Exception nun via Referenz wird einfach das geworfene Object benutzt da eine Referenz ja nichts anderes als ein Zeiger ist.

Fängt man die Exception nun aber ohne Referenz muss ein neues Object angelegt werden und dieses kann dann zwangsläufig nur von dem Typ sein welcher beim Catch Block angegeben wurde.

Das ergibt sich alles aus der C++ Spezifikation.

Che
2003-07-10, 18:50:16
Ja! Hab ichs mir doch gedacht! Schön langsam bin ich soweit dass ich mir die Antworten selber geben kann und nicht mehr euch mit solchen Kleinigkeiten belästigen muss. :)