<?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 bei verschiedenen typedefs]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe beispielhaft eine folgende Klassensituation:</p>
<pre><code class="language-cpp">class BaseValue {}
class Derived : public BaseValue {}

struct BaseData {}
struct DerivedData : BaseData {}

template &lt; typename T_VALUE = BaseValue, typename T_DATA = BaseData , typename T_LIST = std::vector&lt;T_VALUE&gt;&gt;
class TestClass
{
/*[...]*/
}

typedef TestClass &lt; BaseValue,BaseData,std::vector&lt;BaseValue&gt; &gt; BaseTest;
typedef TestClass &lt; Derived,DerivedData,std::vector&lt;DerivedValue&gt; &gt; DerivedTest;
</code></pre>
<p>Nun frage ich mich ob es valide ist DerivedTest in BaseTest mit dynamic_cast zu casten, wie im folgenden Pseudo-Beispiel:</p>
<pre><code class="language-cpp">void any_function(BaseTest* x) { /*Do something*/ }

void main()
{
  DerivedTest* x = GetDerived();
  BaseTest* t_test = dynamic_cast&lt;BaseTest*&gt;(x); if(!t_test) return;
  any_function(t_test);
}
</code></pre>
<p>Der Compiler schreit nicht aber irgendwie bin ich mir unsicher.<br />
(Notiz: Ich bin mir bewusst, dass ich auch einfach any_function() templatieren könnte. Mir geht es explizit um den cast)</p>
<p>Vielen Dank schonmal iV</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/303621/dynamic_cast-bei-verschiedenen-typedefs</link><generator>RSS for Node</generator><lastBuildDate>Mon, 10 Aug 2026 00:49:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/303621.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 18 May 2012 15:41:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to dynamic_cast bei verschiedenen typedefs on Fri, 18 May 2012 15:43:23 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe beispielhaft eine folgende Klassensituation:</p>
<pre><code class="language-cpp">class BaseValue {}
class Derived : public BaseValue {}

struct BaseData {}
struct DerivedData : BaseData {}

template &lt; typename T_VALUE = BaseValue, typename T_DATA = BaseData , typename T_LIST = std::vector&lt;T_VALUE&gt;&gt;
class TestClass
{
/*[...]*/
}

typedef TestClass &lt; BaseValue,BaseData,std::vector&lt;BaseValue&gt; &gt; BaseTest;
typedef TestClass &lt; Derived,DerivedData,std::vector&lt;DerivedValue&gt; &gt; DerivedTest;
</code></pre>
<p>Nun frage ich mich ob es valide ist DerivedTest in BaseTest mit dynamic_cast zu casten, wie im folgenden Pseudo-Beispiel:</p>
<pre><code class="language-cpp">void any_function(BaseTest* x) { /*Do something*/ }

void main()
{
  DerivedTest* x = GetDerived();
  BaseTest* t_test = dynamic_cast&lt;BaseTest*&gt;(x); if(!t_test) return;
  any_function(t_test);
}
</code></pre>
<p>Der Compiler schreit nicht aber irgendwie bin ich mir unsicher.<br />
(Notiz: Ich bin mir bewusst, dass ich auch einfach any_function() templatieren könnte. Mir geht es explizit um den cast)</p>
<p>Vielen Dank schonmal iV</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2212870</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212870</guid><dc:creator><![CDATA[Katachi]]></dc:creator><pubDate>Fri, 18 May 2012 15:43:23 GMT</pubDate></item><item><title><![CDATA[Reply to dynamic_cast bei verschiedenen typedefs on Fri, 18 May 2012 15:51:43 GMT]]></title><description><![CDATA[<p>Dein Compiler sollte schreien. DerivedTest und BaseTest sind nicht miteinander verwandt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2212878</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212878</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Fri, 18 May 2012 15:51:43 GMT</pubDate></item><item><title><![CDATA[Reply to dynamic_cast bei verschiedenen typedefs on Fri, 18 May 2012 15:52:53 GMT]]></title><description><![CDATA[<p>Sofern DerivedTest polymorph ist, ist das legal.<br />
In jedem Fall aber ist es sinnlos, es kann nur ein nullptr herauskommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2212879</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212879</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 18 May 2012 15:52:53 GMT</pubDate></item><item><title><![CDATA[Reply to dynamic_cast bei verschiedenen typedefs on Fri, 18 May 2012 15:53:33 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Sofern DerivedTest polymorph ist, ist das legal.</p>
</blockquote>
<p>Kannst du das bitte mal kurz erklären?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2212880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212880</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Fri, 18 May 2012 15:53:33 GMT</pubDate></item><item><title><![CDATA[Reply to dynamic_cast bei verschiedenen typedefs on Fri, 18 May 2012 15:56:15 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>Sofern DerivedTest polymorph ist, ist das legal.</p>
</blockquote>
<p>Kannst du das bitte mal kurz erklären?</p>
</blockquote>
<p>Crosscast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2212882</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212882</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 18 May 2012 15:56:15 GMT</pubDate></item><item><title><![CDATA[Reply to dynamic_cast bei verschiedenen typedefs on Fri, 18 May 2012 16:00:51 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>Sofern DerivedTest polymorph ist, ist das legal.</p>
</blockquote>
<p>Kannst du das bitte mal kurz erklären?</p>
</blockquote>
<p>Crosscast.</p>
</blockquote>
<p>Ah, OK.<br />
dafür ists aber immer 0, oder?<br />
Gibt es eine Situation wo nicht 0 heraus kommen kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2212885</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212885</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Fri, 18 May 2012 16:00:51 GMT</pubDate></item><item><title><![CDATA[Reply to dynamic_cast bei verschiedenen typedefs on Fri, 18 May 2012 16:15:37 GMT]]></title><description><![CDATA[<p>Danke erstmal für die Antworten.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a>: okay, hmm, ich dachte da die Template Parameter selber gecasted werden könnten, dass auch das Klassentemplate entsprechend gecasted werden kann. Warum geht das eigentlich nicht?</p>
<p>Gut dann werde ich eine (template-lose) Basisklasse erzeugen von der TestClass erbt und entsprechend anstatt zu BaseTest dann einfach zur Basisklasse casten. Obwohl das natürlich nich gerade elegant ist. Gibt es denn einen besseren Weg (bis auf entpsrechende templates natürlich...klar)?</p>
<p>Vielen Dank jedenfalls und ich bin interessiert an weiterführenden Links zu diesem Thema.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2212888</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212888</guid><dc:creator><![CDATA[Katachi]]></dc:creator><pubDate>Fri, 18 May 2012 16:15:37 GMT</pubDate></item><item><title><![CDATA[Reply to dynamic_cast bei verschiedenen typedefs on Fri, 18 May 2012 16:26:14 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>DerivedTest und BaseTest sind nicht miteinander verwandt.</p>
</blockquote>
<p>Ja, die hier auftretenden dynamischen Typen stehen in keiner Vererbungsbeziehung. Ein DerivedTest ist kein BaseTest und ein BaseTest ist kein DerivedTest. Ich verstehe camper jetzt so, dass er sich auf das &quot;sollte schreien&quot; bezog. Ich dachte zunächst, er würde irgendwo eine Veerbungsbeziehung sehen, wo keine ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2212893</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212893</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 18 May 2012 16:26:14 GMT</pubDate></item><item><title><![CDATA[Reply to dynamic_cast bei verschiedenen typedefs on Tue, 29 May 2012 16:47:12 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>DerivedTest und BaseTest sind nicht miteinander verwandt.</p>
</blockquote>
<p>Ja, die hier auftretenden dynamischen Typen stehen in keiner Vererbungsbeziehung. Ein DerivedTest ist kein BaseTest und ein BaseTest ist kein DerivedTest. Ich verstehe camper jetzt so, dass er sich auf das &quot;sollte schreien&quot; bezog. Ich dachte zunächst, er würde irgendwo eine Veerbungsbeziehung sehen, wo keine ist.</p>
</blockquote>
<p>Eine Folgefrage. Theoretisch könnte ich ja auch für alle ein BaseTest objekt erzeugen und denoch die abgeleiteten Typen darin speichern oder?</p>
<p>Also quasi ca so:</p>
<pre><code class="language-cpp">BaseTest* abgeleitet = new BaseTest();

for(x..){
DerivedValue* val = server-&gt;GetDerivedValue(x);
abgeleitet.addEntry(val);
}

//wobei TestClass::addEntry(const T_VALUE* t_val) {...}
</code></pre>
<p>Spricht da was gegen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2216896</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2216896</guid><dc:creator><![CDATA[Katachi]]></dc:creator><pubDate>Tue, 29 May 2012 16:47:12 GMT</pubDate></item><item><title><![CDATA[Reply to dynamic_cast bei verschiedenen typedefs on Tue, 29 May 2012 22:30:29 GMT]]></title><description><![CDATA[<p>Katachi schrieb:</p>
<blockquote>
<p>Eine Folgefrage. Theoretisch könnte ich ja auch für alle ein BaseTest objekt erzeugen und denoch die abgeleiteten Typen darin speichern oder?</p>
</blockquote>
<p>Ja.</p>
<p>Deinen Code verstehe ich zwar nicht, aber uU suchst du das Stichwort: type erasure.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2217070</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2217070</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Tue, 29 May 2012 22:30:29 GMT</pubDate></item><item><title><![CDATA[Reply to dynamic_cast bei verschiedenen typedefs on Tue, 29 May 2012 22:43:47 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Ah, OK.<br />
dafür ists aber immer 0, oder?<br />
Gibt es eine Situation wo nicht 0 heraus kommen kann?</p>
</blockquote>
<p>Naja, wenn er einen Pointer castet, kommt nullptr raus, wenn er eine Referenz castet, fliegt ein std::bad_cast <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="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2217073</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2217073</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Tue, 29 May 2012 22:43:47 GMT</pubDate></item><item><title><![CDATA[Reply to dynamic_cast bei verschiedenen typedefs on Wed, 30 May 2012 10:25:58 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Katachi schrieb:</p>
<blockquote>
<p>Eine Folgefrage. Theoretisch könnte ich ja auch für alle ein BaseTest objekt erzeugen und denoch die abgeleiteten Typen darin speichern oder?</p>
</blockquote>
<p>Ja.</p>
<p>Deinen Code verstehe ich zwar nicht, aber uU suchst du das Stichwort: type erasure.</p>
</blockquote>
<p>Vielen Dank für den Hinweis auf type erasure!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2217179</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2217179</guid><dc:creator><![CDATA[Katachi]]></dc:creator><pubDate>Wed, 30 May 2012 10:25:58 GMT</pubDate></item><item><title><![CDATA[Reply to dynamic_cast bei verschiedenen typedefs on Wed, 30 May 2012 10:26:11 GMT]]></title><description><![CDATA[<p>Katachi, <a href="http://www.c-plusplus.net/forum/200753" rel="nofollow">Was willst du eigentlich erreichen?</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2217180</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2217180</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 30 May 2012 10:26:11 GMT</pubDate></item><item><title><![CDATA[Reply to dynamic_cast bei verschiedenen typedefs on Wed, 30 May 2012 10:29:54 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>Sofern DerivedTest polymorph ist, ist das legal.</p>
</blockquote>
<p>Kannst du das bitte mal kurz erklären?</p>
</blockquote>
<p>Crosscast.</p>
</blockquote>
<p>Ah, OK.<br />
dafür ists aber immer 0, oder?<br />
Gibt es eine Situation wo nicht 0 heraus kommen kann?</p>
</blockquote>
<p>Klar.</p>
<pre><code class="language-cpp">struct Foo : BaseTest, DerivedTest {};
</code></pre>
<p>Crosscast eben, wie camper schon sagte.<br />
dynamic_cast kann das ja, wenn der Crosscast eindeutig ist (die gesuchte Klasse in der Hierarchie genau 1x vorkommt).<br />
Ohne Foo zu kennen kann man auch nicht wissen dass bzw. ob der Cast jemals &quot;funktionieren&quot; kann. Genau deswegen kann man ihn auch immer schreiben, da ja jede Translation-Unit nur einen Teil der Klassen im gesamten Programm sieht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2217181</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2217181</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 30 May 2012 10:29:54 GMT</pubDate></item><item><title><![CDATA[Reply to dynamic_cast bei verschiedenen typedefs on Wed, 30 May 2012 10:38:18 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Katachi, <a href="http://www.c-plusplus.net/forum/200753" rel="nofollow">Was willst du eigentlich erreichen?</a></p>
</blockquote>
<p>Ich will einfach erstmal wissen was möglich ist, was es für Konzepte gibt, welches der beste Weg ist, welcher Weg welche Vor-/Nachteile bietet...sprich ausprobieren und lernen! Nicht mehr aber auch nicht weniger. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> Ich bin in der Konzeptphase meines Projekts, deswegen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2217186</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2217186</guid><dc:creator><![CDATA[Katachi]]></dc:creator><pubDate>Wed, 30 May 2012 10:38:18 GMT</pubDate></item><item><title><![CDATA[Reply to dynamic_cast bei verschiedenen typedefs on Wed, 30 May 2012 10:42:12 GMT]]></title><description><![CDATA[<p>Katachi schrieb:</p>
<blockquote>
<p>[...] welches der beste Weg ist [...]</p>
</blockquote>
<p>Wenn dynamic_cast vorkommt, ist es in der Regel alles andere als der beste Weg <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="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2217190</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2217190</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Wed, 30 May 2012 10:42:12 GMT</pubDate></item></channel></rss>