<?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[Dynamic cast can never succeed: Wieso?]]></title><description><![CDATA[<p>Ich habe ein Hashtable (QHash) in dem Objekte vom Typ Input sind.<br />
Input hat verschiedene Unterklassen, unter anderem ChoiceInput (zumindest ist das so gedacht).</p>
<p>Jetzt möchte ich gerne wissen ob ein bestimmtes Objekt aus dem Hashtable ein Choiceinput ist und habe diesen Code dafür geschrieben:</p>
<pre><code>if (inputTable.contains(objectName)) {
	Input input = inputTable.value(objectName);	
	ChoiceInput *choiceInput = dynamic_cast&lt;ChoiceInput*&gt;(&amp;input);
	if (choiceInput) {
		//do stuff with choiceInput
	}	
}
</code></pre>
<p>Der compiler sagt mir jetzt dass dieser Cast nie erfolgreich sein kann, was habe ich falsch gemacht?<br />
Die Klasse habe ich so definiert:<br />
class ChoiceInput: public Input<br />
und in der Input-Headerdatei habe ich den Dekonstruktor virtual gemacht.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/308066/dynamic-cast-can-never-succeed-wieso</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/308066.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 13 Sep 2012 14:06:39 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Dynamic cast can never succeed: Wieso? on Thu, 13 Sep 2012 14:06:39 GMT]]></title><description><![CDATA[<p>Ich habe ein Hashtable (QHash) in dem Objekte vom Typ Input sind.<br />
Input hat verschiedene Unterklassen, unter anderem ChoiceInput (zumindest ist das so gedacht).</p>
<p>Jetzt möchte ich gerne wissen ob ein bestimmtes Objekt aus dem Hashtable ein Choiceinput ist und habe diesen Code dafür geschrieben:</p>
<pre><code>if (inputTable.contains(objectName)) {
	Input input = inputTable.value(objectName);	
	ChoiceInput *choiceInput = dynamic_cast&lt;ChoiceInput*&gt;(&amp;input);
	if (choiceInput) {
		//do stuff with choiceInput
	}	
}
</code></pre>
<p>Der compiler sagt mir jetzt dass dieser Cast nie erfolgreich sein kann, was habe ich falsch gemacht?<br />
Die Klasse habe ich so definiert:<br />
class ChoiceInput: public Input<br />
und in der Input-Headerdatei habe ich den Dekonstruktor virtual gemacht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2250991</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2250991</guid><dc:creator><![CDATA[simon.hain]]></dc:creator><pubDate>Thu, 13 Sep 2012 14:06:39 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamic cast can never succeed: Wieso? on Thu, 13 Sep 2012 14:13:08 GMT]]></title><description><![CDATA[<p>Weil ein <code>Input</code> Objekt niemals ein <code>ChoiceInput</code> Objekt sein, nur umgekehrt.</p>
<p>Edit:</p>
<pre><code class="language-cpp">if (inputTable.contains(objectName)) { 
    Input input = inputTable.value(objectName);    
    ChoiceInput *choiceInput = dynamic_cast&lt;ChoiceInput*&gt;(&amp;input); 
    if (choiceInput) { 
        //do stuff with choiceInput 
    }    
}
</code></pre>
<p>In Zeile 2 kopierst du den Inhalt aus der Hash Map, dabei tritt <code>Object Slicing</code> auf, d.h. alle Informationen der abgeleiteten Klasse gehen verloren und du erhälst nur die Informationen der Basisklasse. Anschließend versuchst du die verloren gegangenen Informationen wieder <em>dazuzucasten</em>, was natürlich nicht gelingen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2250993</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2250993</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Thu, 13 Sep 2012 14:13:08 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamic cast can never succeed: Wieso? on Thu, 13 Sep 2012 14:11:57 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">Input input = inputTable.value(objectName);
</code></pre>
<p>Hier kopierst du das Objekt und verlierst dabei alle Informationen über <code>ChoiceInput</code> . Du hast effektiv nun ein <code>Input</code> Objekt.</p>
<p>Siehe auch: <a href="http://en.wikipedia.org/wiki/Object_slicing" rel="nofollow">Object Slicing</a>.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2250994</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2250994</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Thu, 13 Sep 2012 14:11:57 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamic cast can never succeed: Wieso? on Thu, 13 Sep 2012 14:14:53 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<pre><code class="language-cpp">Input input = inputTable.value(objectName);
</code></pre>
<p>Hier kopierst du das Objekt und verlierst dabei alle Informationen über <code>ChoiceInput</code> . Du hast effektiv nun ein <code>Input</code> Objekt.</p>
<p>Siehe auch: <a href="http://en.wikipedia.org/wiki/Object_slicing" rel="nofollow">Object Slicing</a>.</p>
<p>Grüssli</p>
</blockquote>
<p>Danke für die schnelle Antwort, das erklärt das Problem!</p>
<p>Hast Du eine Idee wie ich meine Anforderung anders umsetzen könnte?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2250998</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2250998</guid><dc:creator><![CDATA[simon.hain]]></dc:creator><pubDate>Thu, 13 Sep 2012 14:14:53 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamic cast can never succeed: Wieso? on Thu, 13 Sep 2012 14:16:01 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<pre><code class="language-cpp">Input input = inputTable.value(objectName);
</code></pre>
<p>Hier kopierst du das Objekt und verlierst dabei alle Informationen über <code>ChoiceInput</code> . Du hast effektiv nun ein <code>Input</code> Objekt.</p>
<p>Siehe auch: <a href="http://en.wikipedia.org/wiki/Object_slicing" rel="nofollow">Object Slicing</a>.</p>
<p>Grüssli</p>
</blockquote>
<p>Wahrscheinlich auch schon vorher in der HashMap.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2250999</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2250999</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Thu, 13 Sep 2012 14:16:01 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamic cast can never succeed: Wieso? on Thu, 13 Sep 2012 14:25:53 GMT]]></title><description><![CDATA[<p>Jockelx schrieb:</p>
<blockquote>
<p>Wahrscheinlich auch schon vorher in der HashMap.</p>
</blockquote>
<p>Ja, müsste dann ja, QHash habe ich ja mit &lt;QString, Input&gt; definiert.<br />
Argh! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /></p>
<p>Gibt es denn eine Möglichkeit wie ich eine Anzahl von verschiedenen Unterklassen in einem Hashtable (o.ä.) unterbringen kann?<br />
In Java gibt es das Object-Slicing nicht, bislang war mir das neu.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2251000</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2251000</guid><dc:creator><![CDATA[simon.hain]]></dc:creator><pubDate>Thu, 13 Sep 2012 14:25:53 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamic cast can never succeed: Wieso? on Thu, 13 Sep 2012 14:29:47 GMT]]></title><description><![CDATA[<p>Das Design ist so eh völlig verkackt. (Wie so gut wie immer wenn man irgendwo dynamic_cast sieht.)<br />
Entweder du willst das verhalten des Objekts beeinflussen, dann nimm eine virtuelle Funktion, oder du willst eine Art Typinformation abspeichern, dann nimm halt ein enum. Aber das da ist Quatsch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2251008</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2251008</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Thu, 13 Sep 2012 14:29:47 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamic cast can never succeed: Wieso? on Thu, 13 Sep 2012 14:31:12 GMT]]></title><description><![CDATA[<p>simon.hain schrieb:</p>
<blockquote>
<p>Gibt es denn eine Möglichkeit wie ich eine Anzahl von verschiedenen Unterklassen in einem Hashtable (o.ä.) unterbringen kann?</p>
</blockquote>
<p>Ja, du musst Zeiger (oder smart-Pointer) auf die Objekte ablegen, denn die sind stets gleich gross und nix wird 'gesliced'.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2251010</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2251010</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Thu, 13 Sep 2012 14:31:12 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamic cast can never succeed: Wieso? on Fri, 14 Sep 2012 14:07:02 GMT]]></title><description><![CDATA[<p>Jockelx schrieb:</p>
<blockquote>
<p>Ja, du musst Zeiger (oder smart-Pointer) auf die Objekte ablegen, denn die sind stets gleich gross und nix wird 'gesliced'.</p>
</blockquote>
<p>Edit:<br />
Alles klar, hab es hinbekommen, bei allen mutable classes habe ich den Pointer, jetzt funktioniert es so wie ich mir das vorgestellt hab.<br />
(auch das dynamic_cast, wieso das böse ist verstehe ich allerdings nicht, dafür jetzt ein visitor pattern zu bauen ist doch übertrieben?)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2251014</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2251014</guid><dc:creator><![CDATA[simon.hain]]></dc:creator><pubDate>Fri, 14 Sep 2012 14:07:02 GMT</pubDate></item></channel></rss>