Matroids Matheplanet Forum Index
Moderiert von matph
Informatik » Programmieren » C++: Ausnahmebehandlung
Autor
Universität/Hochschule J C++: Ausnahmebehandlung
Lux93
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 16.07.2012
Mitteilungen: 170
  Themenstart: 2022-01-19

Hallo, leider habe ich Schwierigkeiten dabei, mir die Ausgabe des folgenden Programms zu erklären: \sourceon C++ #include using namespace std; class B{ public: virtual void eineMethode(); }; void B::eineMethode(){ cout << "Hier die Basisklasse" << endl; } class A : public B{ public: void eineMethode(); }; void A::eineMethode(){ cout << "Hier die abgeleitete Klasse" << endl; } int main() { try{ throw A(); } catch (B b) { b.eineMethode(); } try{ throw A(); } catch (B& b){ b.eineMethode(); } return 0; } \sourceoff Wir haben in der Vorlesung nur relativ kurz über Ausnahmebehandlungen gesprochen. Ich habe zunächst zwei Verständnisfragen: 1. Mir ist nicht ganz klar, was in den Zeilen geworfen wird, weil mir die Schreibweise A() nicht bekannt ist. Mir ist bewusst, dass ich den Standardkonstruktur der Klasse A z. B. so aufrufen würde: A x(); Hierbei würde ich dann das Objekt x der Klasse A erzeugen. Erzeugt die Anweisung A(); ein Objekt ohne Namen (falls dies überhaupt möglich ist) oder was genau bezweckt diese Zeile? 2. Die beiden catch-Blöcke haben als Parameter ein Objekt der Klasse B bzw. eine Referenz auf ein solches Objekt. Ist es grundsätzlich so, dass catch-Blöcke immer Objekte einer Klasse der angegebenen Parameter und entsprechende abgeleitete Klassen abfangen?


   Profil
ligning
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 07.12.2014
Mitteilungen: 3447
Wohnort: Berlin
  Beitrag No.1, eingetragen 2022-01-19

\quoteon(2022-01-19 18:22 - Lux93 im Themenstart) 1. Mir ist nicht ganz klar, was in den Zeilen geworfen wird, weil mir die Schreibweise A() nicht bekannt ist. Mir ist bewusst, dass ich den Standardkonstruktur der Klasse A z. B. so aufrufen würde: A x(); Hierbei würde ich dann das Objekt x der Klasse A erzeugen. \quoteoff Das stimmt nicht, das ist eine Deklaration einer Funktion x, die ein A zurückgibt. Ein defaultkonstruiertes Objekt erzeugt man entweder einfach durch A x; oder durch A x{};. Das Missverständnis ist dir aber nicht wirklich anzulasten, denn es wäre durchaus zu erwarten, dass A x(); ein defaultkonstruiertes Objekt erzeugt. Es kann halt nur auch als Funktionsdeklaration interpretiert werden, und diese Interpretation hat grundsätzlich Vorrang. Deine Intuition hierzu ist also völlig richtig: \quoteon Erzeugt die Anweisung A(); ein Objekt ohne Namen (falls dies überhaupt möglich ist) oder was genau bezweckt diese Zeile? \quoteoff Genau so ist es. Durch throw A() wird ein defaultkonstruiertes Objekt des Typs A als Exception geworfen. \quoteon 2. Die beiden catch-Blöcke haben als Parameter ein Objekt der Klasse B bzw. eine Referenz auf ein solches Objekt. Ist es grundsätzlich so, dass catch-Blöcke immer Objekte einer Klasse der angegebenen Parameter und entsprechende abgeleitete Klassen abfangen? \quoteoff Ja. Der Unterschied zwischen den beiden Formen ist: Im ersten Fall wird im catch ein Objekt der Klasse B als Kopie der Exception erzeugt. Falls die Exception in Wirklichkeit von der Klasse A ist kommt es dabei zu Slicing. Es gibt meines Wissens keinen Grund, jemals eine Exception auf diese Art, also by-value, zu fangen. Im zweiten Fall wird keine Kopie erzeugt, die Referenz verweist auf das Exception-Objekt.


   Profil
Lux93
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 16.07.2012
Mitteilungen: 170
  Beitrag No.2, vom Themenstarter, eingetragen 2022-01-19

Hallo ligning, okay, vielen Dank für deine Hilfe. Jetzt ist mir auch klar, warum im ersten catch-Block die Methode der Klasse B und nicht der Klasse A aufgerufen wird.


   Profil
Lux93 hat die Antworten auf ihre/seine Frage gesehen.
Lux93 hat selbst das Ok-Häkchen gesetzt.

Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2022 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]