<?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[nicht &amp;quot;so&amp;quot; virtuale Funktionen]]></title><description><![CDATA[<p>Hallo</p>
<p>ich bin gerade etwas verwundert wie virtuale funktionen sich verhalten - aus der Schule kann ich mich erninnern, dass für virtuale Funktionen eine Tabelle angelegt wird, wie angibt zu welcher Klasse die Funktion jetzt dazu gehört und die richtige Funktion wird dann aufgerufen.<br />
Aber es funktioniert nicht so wie ich es mir dachte...</p>
<p>In dem beispiel werden schon richtige Klassen geworfen - so wie es gedacht war - nur die Ausgabe der pError Funktion ist immer gleich, nämlich die von EBase Klasse. Ich dachte da die funktionen virtual sind, dass diese damit unterschieden werden können.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;cstring&gt;

// Basisklasse
class EBase : public std::exception
{
	public:
		virtual void pError( ){ std::cerr &lt;&lt; &quot;EBase exception&quot; &lt;&lt; std::endl; }
};

// Abgeleitete Klasse
class EChild : public EBase
{
	public:
		virtual void pError( ){ std::cerr &lt;&lt; &quot;EChild Exception&quot; &lt;&lt; std::endl; }
};

// foo kann sowohl EBase, wie auch EChild werfen
void foo ( int argc)
{
	if (argc == 1)
	{
		throw EBase();
	}
	else
	{
		throw EChild();
	}
}

int main (int argc, char** argv)
{
	try
	{
		foo( argc );
	} catch ( EBase e )
	{
		e.pError( );
	}

	return 0;
}
</code></pre>
<p>Wieso ist die Ausgabe immer von EBase und nie von EChild?</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/289088/nicht-quot-so-quot-virtuale-funktionen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 19 Aug 2026 08:53:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/289088.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 28 Jun 2011 14:08:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to nicht &amp;quot;so&amp;quot; virtuale Funktionen on Tue, 28 Jun 2011 14:08:01 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>ich bin gerade etwas verwundert wie virtuale funktionen sich verhalten - aus der Schule kann ich mich erninnern, dass für virtuale Funktionen eine Tabelle angelegt wird, wie angibt zu welcher Klasse die Funktion jetzt dazu gehört und die richtige Funktion wird dann aufgerufen.<br />
Aber es funktioniert nicht so wie ich es mir dachte...</p>
<p>In dem beispiel werden schon richtige Klassen geworfen - so wie es gedacht war - nur die Ausgabe der pError Funktion ist immer gleich, nämlich die von EBase Klasse. Ich dachte da die funktionen virtual sind, dass diese damit unterschieden werden können.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;cstring&gt;

// Basisklasse
class EBase : public std::exception
{
	public:
		virtual void pError( ){ std::cerr &lt;&lt; &quot;EBase exception&quot; &lt;&lt; std::endl; }
};

// Abgeleitete Klasse
class EChild : public EBase
{
	public:
		virtual void pError( ){ std::cerr &lt;&lt; &quot;EChild Exception&quot; &lt;&lt; std::endl; }
};

// foo kann sowohl EBase, wie auch EChild werfen
void foo ( int argc)
{
	if (argc == 1)
	{
		throw EBase();
	}
	else
	{
		throw EChild();
	}
}

int main (int argc, char** argv)
{
	try
	{
		foo( argc );
	} catch ( EBase e )
	{
		e.pError( );
	}

	return 0;
}
</code></pre>
<p>Wieso ist die Ausgabe immer von EBase und nie von EChild?</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2085443</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2085443</guid><dc:creator><![CDATA[Feld]]></dc:creator><pubDate>Tue, 28 Jun 2011 14:08:01 GMT</pubDate></item><item><title><![CDATA[Reply to nicht &amp;quot;so&amp;quot; virtuale Funktionen on Tue, 28 Jun 2011 14:20:56 GMT]]></title><description><![CDATA[<p>Du sliced deine Exception, weil du sie per value fängst.</p>
<p>Versuchs mal so:</p>
<pre><code class="language-cpp">catch ( EBase&amp; e )
</code></pre>
<p>Edit:<br />
&quot;Throw by value, catch by reference.&quot; <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
Im Prinzip passiert dir sonst das hier:<br />
<a href="http://en.wikipedia.org/wiki/Object_slicing" rel="nofollow">http://en.wikipedia.org/wiki/Object_slicing</a></p>
<p>Gruß<br />
Dobi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2085449</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2085449</guid><dc:creator><![CDATA[Dobi]]></dc:creator><pubDate>Tue, 28 Jun 2011 14:20:56 GMT</pubDate></item><item><title><![CDATA[Reply to nicht &amp;quot;so&amp;quot; virtuale Funktionen on Tue, 28 Jun 2011 14:43:45 GMT]]></title><description><![CDATA[<p>So einfach war das! super, danke dir</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2085468</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2085468</guid><dc:creator><![CDATA[Feld]]></dc:creator><pubDate>Tue, 28 Jun 2011 14:43:45 GMT</pubDate></item></channel></rss>