|
Autor |
C++: Ausnahmebehandlung |
|
Lux93
Aktiv  Dabei seit: 16.07.2012 Mitteilungen: 150
 | 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  Dabei seit: 07.12.2014 Mitteilungen: 3428
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  Dabei seit: 16.07.2012 Mitteilungen: 150
 | 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. |
|
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]
|