<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[try catch Verständnisfrage]]></title><description><![CDATA[<p>Hallo,<br />
ich beschäftige mich gerade mit try-catch, weiß jedoch<br />
nicht was bei Catch (runden Klammern) gemacht wird.<br />
Vorallem warum mit &quot;&amp;&quot; die abgeleitete Klasse aufgerufen wird..<br />
bzw. was fängt der catch?<br />
Anbei der Code.<br />
Ich habe soweit nach meinem Wissen kommentiert..</p>
<pre><code>class B{
public:
	virtual void eineMethode(){
		cout &lt;&lt; &quot;Basis-Klasse&quot; &lt;&lt; endl;
	}
};

class A : public B{
public:
	void eineMethode(){
		cout &lt;&lt; &quot;abgeleitete Klasse&quot; &lt;&lt; endl;
	}
};

int main(){
	try{					// try-Exeption für das Exeption-Handling
		throw A();			// throw-Anweisung löst eine Exeption aus
	} catch (B b) {			// FEHLT
		b.eineMethode();	// Methode der (Basis-)Klasse wird aufgerufen,
	}						// wenn Exeption auftretet

	try{
		throw A();
	} catch (B&amp; b){			// FEHLT
		b.eineMethode();	// Methode der (abgeleiteten-)Klasse wird aufgerufen,
	}						// wenn Exeption auftretet
	return 0;
}
</code></pre>
<p>Ausgabe:<br />
Basis-Klasse<br />
abgeleitete Klasse</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/326613/try-catch-verständnisfrage</link><generator>RSS for Node</generator><lastBuildDate>Sun, 24 May 2026 22:25:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/326613.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 26 Jun 2014 18:35:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to try catch Verständnisfrage on Thu, 26 Jun 2014 19:09:23 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich beschäftige mich gerade mit try-catch, weiß jedoch<br />
nicht was bei Catch (runden Klammern) gemacht wird.<br />
Vorallem warum mit &quot;&amp;&quot; die abgeleitete Klasse aufgerufen wird..<br />
bzw. was fängt der catch?<br />
Anbei der Code.<br />
Ich habe soweit nach meinem Wissen kommentiert..</p>
<pre><code>class B{
public:
	virtual void eineMethode(){
		cout &lt;&lt; &quot;Basis-Klasse&quot; &lt;&lt; endl;
	}
};

class A : public B{
public:
	void eineMethode(){
		cout &lt;&lt; &quot;abgeleitete Klasse&quot; &lt;&lt; endl;
	}
};

int main(){
	try{					// try-Exeption für das Exeption-Handling
		throw A();			// throw-Anweisung löst eine Exeption aus
	} catch (B b) {			// FEHLT
		b.eineMethode();	// Methode der (Basis-)Klasse wird aufgerufen,
	}						// wenn Exeption auftretet

	try{
		throw A();
	} catch (B&amp; b){			// FEHLT
		b.eineMethode();	// Methode der (abgeleiteten-)Klasse wird aufgerufen,
	}						// wenn Exeption auftretet
	return 0;
}
</code></pre>
<p>Ausgabe:<br />
Basis-Klasse<br />
abgeleitete Klasse</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405776</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405776</guid><dc:creator><![CDATA[dslpro]]></dc:creator><pubDate>Thu, 26 Jun 2014 19:09:23 GMT</pubDate></item><item><title><![CDATA[Reply to try catch Verständnisfrage on Thu, 26 Jun 2014 19:21:58 GMT]]></title><description><![CDATA[<p>Deine Schwierigkeit ist nicht beim try..catch (das vielleicht auch, aber für deine Frage ist das erst einmal egal), sondern bei der Polymorphie (oder auch Vererbung im Allgemeinen). Wenn du einem Objekt der Basisklasse ein Objekt einer abgeleiteten Klasse zuweist (Zuweisung kann hier durchaus auch bedeuten, ein neues Objekt als Kopie zu erzeugen), gehen die Eigenschaften der abgeleiteten Klasse verloren. Wo sollten sie auch hin? Das Objekt der Basisklasse kann diese schließlich nicht aufnehmen. Das nennt sich &quot;slicing&quot;.<br />
Eine Referenz oder ein Zeiger auf ein Objekt können aber durchaus auf ein Objekt einer abgeleiteten Klasse zeigen. Und Polymorphie erlaubt dann dem Objekt, sich durchaus wie ein Objekt der abgeleiteten Klasse zu verhalten, selbst wenn es über einen Basisklassenzeiger angesprochen wird.</p>
<p>Dein Beispiel ist eine Demonstration für den Leitspruch &quot;throw by value, catch by reference&quot;.</p>
<p>Demonstration von Polymorphie ohne try..catch:</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

class A{
public:
  virtual void eineMethode(){
    cout &lt;&lt; &quot;Basis-Klasse&quot; &lt;&lt; endl;
  }
};

class B : public A{
public:
  virtual void eineMethode(){
    cout &lt;&lt; &quot;abgeleitete Klasse&quot; &lt;&lt; endl;
  }
};

int main(){
  A a;
  B b;

  a.eineMethode();
  b.eineMethode();

  A *aptr = &amp;a;
  aptr-&gt;eineMethode();
  aptr = &amp;b;
  aptr-&gt;eineMethode();

  A &amp;aref = a;
  aref.eineMethode();
  A &amp;aref2 = b;
  aref2.eineMethode();

  A acopy = a;
  acopy.eineMethode();
  acopy = b;
  acopy.eineMethode();  
}
</code></pre>
<p>Schlag also am besten noch einmal Vererbung, Polymorphie und Slicing nach. try..catch ist dann nicht großartig anders als ein Funktionsaufruf es wäre:</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

class A{
public:
  virtual void eineMethode(){
    cout &lt;&lt; &quot;Basis-Klasse&quot; &lt;&lt; endl;
  }
};

class B : public A{
public:
  virtual void eineMethode(){
    cout &lt;&lt; &quot;abgeleitete Klasse&quot; &lt;&lt; endl;
  }
};

void do_something_by_value(A acopy)
{
  acopy.eineMethode();
}

void do_something_by_reference(A &amp;aref)
{
  aref.eineMethode();
}

int main(){
  A a;
  B b;

  do_something_by_value(a);
  do_something_by_value(b);
  do_something_by_reference(a);
  do_something_by_reference(b);
}
</code></pre>
<p>In diesem Beispiel ist nichts anders als in dem vorherigen Beispiel. Beim Aufruf der Funktion wird entweder das Objekt kopiert (Variante 1) oder eben eine Referenz mit einem Verweis auf den Parameter initialisiert (Variante 2). Man kann das auch noch einmal mit Pointern machen, aber das spare ich mir mal, da in C++ unüblich und für try..catch irrelevant (es sei denn, du schmeißt einen Pointer auf ein Objekt, was zwar möglich, aber auch unüblich wäre).</p>
<p>P.S.: Ich habe A und B in deinem Code vertauscht, weil ich es sehr unintuitiv fand, dass A von B erbt. Außerdem ist deine Syntax zur Vererbung falsch gewesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405782</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405782</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 26 Jun 2014 19:21:58 GMT</pubDate></item><item><title><![CDATA[Reply to try catch Verständnisfrage on Mon, 30 Jun 2014 21:14:55 GMT]]></title><description><![CDATA[<p>danke für die verständliche Erlärung.<br />
Ich habe mir die Themen nochmal angeschaut und mir ist jetzt klarer geworden <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406404</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406404</guid><dc:creator><![CDATA[dslpro]]></dc:creator><pubDate>Mon, 30 Jun 2014 21:14:55 GMT</pubDate></item></channel></rss>