<?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[Frage zu zwei Klassen mit einer Referenz]]></title><description><![CDATA[<p>Hallo zusammen, ich habe hier eine Aufgabe durch die ich nicht ganz durchblicke.</p>
<p>Die Ausgabe des Programms ist folgendes:</p>
<p>Basis<br />
Ableitung</p>
<p>Der Code ist folgender:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class B{
public:
	virtual void eineMethode(){

		cout &lt;&lt; &quot;Basis&quot; &lt;&lt; endl;
	}

};

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

};

int main(void){

	try{
		throw A();
	}
	catch (B b){
		b.eineMethode();
	}

	try{
		throw A();
	}
	catch (B &amp;b){
		b.eineMethode();
	}
}
</code></pre>
<p>Ich bekomme diesen Teil einfach nicht in meine Birne.</p>
<pre><code class="language-cpp">catch (B &amp;b){
		b.eineMethode();
	}
</code></pre>
<p>Wieso wird dort jetzt die Klasse A aufgerufen, obwohl ein B erzeugt wurde und die Methode von b.eineMethode aufgerufen wird?</p>
<p>Auch verstehe ich</p>
<pre><code class="language-cpp">throw A()
</code></pre>
<p>leider nicht. Wozu soll das gut sein? Ist das nur zur Verwirrung? Es wird doch dort gar nichts angelegt, sondern nur der Standardkonstruktor ohne Parameter aufgerufen - sehe ich das richtig?</p>
<p>Hoffe meine Frage ist einigermaßen klar. Es ist schwer sich korrekt auszudrücken.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/308067/frage-zu-zwei-klassen-mit-einer-referenz</link><generator>RSS for Node</generator><lastBuildDate>Thu, 06 Aug 2026 05:58:46 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/308067.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 13 Sep 2012 14:13:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu zwei Klassen mit einer Referenz on Thu, 13 Sep 2012 14:13:41 GMT]]></title><description><![CDATA[<p>Hallo zusammen, ich habe hier eine Aufgabe durch die ich nicht ganz durchblicke.</p>
<p>Die Ausgabe des Programms ist folgendes:</p>
<p>Basis<br />
Ableitung</p>
<p>Der Code ist folgender:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class B{
public:
	virtual void eineMethode(){

		cout &lt;&lt; &quot;Basis&quot; &lt;&lt; endl;
	}

};

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

};

int main(void){

	try{
		throw A();
	}
	catch (B b){
		b.eineMethode();
	}

	try{
		throw A();
	}
	catch (B &amp;b){
		b.eineMethode();
	}
}
</code></pre>
<p>Ich bekomme diesen Teil einfach nicht in meine Birne.</p>
<pre><code class="language-cpp">catch (B &amp;b){
		b.eineMethode();
	}
</code></pre>
<p>Wieso wird dort jetzt die Klasse A aufgerufen, obwohl ein B erzeugt wurde und die Methode von b.eineMethode aufgerufen wird?</p>
<p>Auch verstehe ich</p>
<pre><code class="language-cpp">throw A()
</code></pre>
<p>leider nicht. Wozu soll das gut sein? Ist das nur zur Verwirrung? Es wird doch dort gar nichts angelegt, sondern nur der Standardkonstruktor ohne Parameter aufgerufen - sehe ich das richtig?</p>
<p>Hoffe meine Frage ist einigermaßen klar. Es ist schwer sich korrekt auszudrücken.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2250997</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2250997</guid><dc:creator><![CDATA[Shizophren]]></dc:creator><pubDate>Thu, 13 Sep 2012 14:13:41 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu zwei Klassen mit einer Referenz on Thu, 13 Sep 2012 14:28:18 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Shizophren schrieb:</p>
<blockquote>
<p>Wieso wird dort jetzt die Klasse A aufgerufen, obwohl ein B erzeugt wurde und die Methode von b.eineMethode aufgerufen wird?</p>
</blockquote>
<p>Die Bezeichner sind vielleicht verwirrend. A ist Ableitung, nicht Basis.<br />
Es wird ein A erzeugt und kein B. Dieses A wird einmal als Referenz übergeben (und bleibt somit ein A) und einmal als Kopie (und wird daher zu B).</p>
<p>Shizophren schrieb:</p>
<blockquote>
<p>Auch verstehe ich</p>
<pre><code class="language-cpp">throw A()
</code></pre>
<p>leider nicht. Wozu soll das gut sein? Ist das nur zur Verwirrung? Es wird doch dort gar nichts angelegt, sondern nur der Standardkonstruktor ohne Parameter aufgerufen - sehe ich das richtig?</p>
</blockquote>
<p>Irgendwie musste ja in den catch-Block kommen...versteh die Frage nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2251006</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2251006</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Thu, 13 Sep 2012 14:28:18 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu zwei Klassen mit einer Referenz on Thu, 13 Sep 2012 14:35:13 GMT]]></title><description><![CDATA[<p>Shizophren schrieb:</p>
<blockquote>
<p>Ich bekomme diesen Teil einfach nicht in meine Birne.</p>
<pre><code class="language-cpp">catch (B &amp;b){
		b.eineMethode();
	}
</code></pre>
<p>Wieso wird dort jetzt die Klasse A aufgerufen, obwohl ein B erzeugt wurde und die Methode von b.eineMethode aufgerufen wird?</p>
</blockquote>
<p>Es wurde kein B erzeugt. Guck genau hin:<br />
<code>catch (B &amp;b)</code><br />
Das ist eine Referenz auf ein B-Objekt, kein B-Objekt. hinter der Referenz steckt aber das vom throw erzeugte A-Objekt und das virtual greift daher.</p>
<blockquote>
<p>Auch verstehe ich</p>
<pre><code class="language-cpp">throw A()
</code></pre>
<p>leider nicht. Wozu soll das gut sein?</p>
</blockquote>
<p>Es erzuegt ein A-Objekt.</p>
<blockquote>
<p>Ist das nur zur Verwirrung?</p>
</blockquote>
<p>Vermutlich auch, damit du lernst, wie Exceptions funktionieren.</p>
<blockquote>
<p>Es wird doch dort gar nichts angelegt, sondern nur der Standardkonstruktor ohne Parameter aufgerufen - sehe ich das richtig?</p>
</blockquote>
<p>Nein. Ein throw erzeugt tatsächlich ein Objekt.</p>
<p>Verstehst du den Code, wenn ich etwas vergleichbares mal ohne Exceptionhandling schreibe?</p>
<pre><code class="language-cpp">A a;
  B b = a;
  B &amp; bref = a;
  b.eineMethode();
  bref.eineMethode();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2251013</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2251013</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 13 Sep 2012 14:35:13 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu zwei Klassen mit einer Referenz on Thu, 13 Sep 2012 14:54:53 GMT]]></title><description><![CDATA[<p>Hi, danke für eure Antworten!<br />
Das kann ich nachvollziehen.</p>
<pre><code class="language-cpp">A a;
  B b = a;
  B &amp; bref = a;
  b.eineMethode();
  bref.eineMethode();
</code></pre>
<p>Noch blicke ich nicht ganz durch meinen Code:</p>
<pre><code class="language-cpp">try{
        throw A();
    }
    catch (B b){
        b.eineMethode();
    }
</code></pre>
<p>Sehe ich das richtig, dass hier ein Objekt A erzeugt wird</p>
<pre><code class="language-cpp">throw A();
</code></pre>
<p>aber auch ein Objekt B und davon wird dann die Methode eineMethode aufgerufen?</p>
<pre><code class="language-cpp">catch (B b){
        b.eineMethode();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2251026</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2251026</guid><dc:creator><![CDATA[Shizophren]]></dc:creator><pubDate>Thu, 13 Sep 2012 14:54:53 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu zwei Klassen mit einer Referenz on Thu, 13 Sep 2012 15:04:12 GMT]]></title><description><![CDATA[<p>Shizophren schrieb:</p>
<blockquote>
<p>Sehe ich das richtig, dass hier ein Objekt A erzeugt wird</p>
<pre><code class="language-cpp">throw A();
</code></pre>
<p>aber auch ein Objekt B und davon wird dann die Methode eineMethode aufgerufen?</p>
<pre><code class="language-cpp">catch (B b){
        b.eineMethode();
</code></pre>
</blockquote>
<pre><code class="language-cpp">A()
</code></pre>
<p>erzweugt ein temporäres Objekt des Typs A.</p>
<pre><code class="language-cpp">throw A()
</code></pre>
<p>nimmt dieses erzeugte Objekt, um ein (temporäres) Exceptionobjekt (des Typs A) durch Kopieren/Verschieben zu erzeugen (copy/move-elision ist möglich)</p>
<pre><code class="language-cpp">catch (B b)
</code></pre>
<p>benutzt das Exceptionobjekt (des Typs A) um den Parameter des Handlers (also das Objekt b) des Typs B zu initialisieren. Dabei kommt der Copykonstruktor von B zum Einsatz, weil das Exceptionobjekt an dessen Parameter (des Typs const B&amp;) gebunden werden kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2251030</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2251030</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 13 Sep 2012 15:04:12 GMT</pubDate></item></channel></rss>