<?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[Unterschiede im Casting]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe bisher nicht ganz verstanden wann ich normal casten kann und wann ich static &amp; dynamic casts brauche?</p>
<pre><code class="language-cpp">MyClass *m_pMyClass = (MyClass*)m_pMyClassB;
m_pMyClass = static_cast&lt;MyClass*&gt;m_pMyClassB;
m_pMyClass = dynamic_cast&lt;MyClass*&gt;m_pMyClassB;
</code></pre>
<p>Hängt das irgendwie von der Implementierung von MyClassB ab oder wann brauche ich die anderen?</p>
<p>danke</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/156679/unterschiede-im-casting</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 22:10:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/156679.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 19 Aug 2006 07:16:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Unterschiede im Casting on Sat, 19 Aug 2006 07:16:10 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe bisher nicht ganz verstanden wann ich normal casten kann und wann ich static &amp; dynamic casts brauche?</p>
<pre><code class="language-cpp">MyClass *m_pMyClass = (MyClass*)m_pMyClassB;
m_pMyClass = static_cast&lt;MyClass*&gt;m_pMyClassB;
m_pMyClass = dynamic_cast&lt;MyClass*&gt;m_pMyClassB;
</code></pre>
<p>Hängt das irgendwie von der Implementierung von MyClassB ab oder wann brauche ich die anderen?</p>
<p>danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1120107</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1120107</guid><dc:creator><![CDATA[__et_]]></dc:creator><pubDate>Sat, 19 Aug 2006 07:16:10 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiede im Casting on Sat, 19 Aug 2006 07:21:31 GMT]]></title><description><![CDATA[<p>Es geht fast alles mit der Variante (MyClass*), bis auf einige Fälle des dynamic_cast. Trotzdem sollte man den ()-Cast in C++ nicht benutzen. Er kann eben zu viel. Die C++-Casts können jeder für sich etwas weniger, dadurch castet man nicht aus versehen zu viel weg.</p>
<p>static_cast für einfache Typkonvertierungen verwandter Typen. static_cast kann zum Beispiel kein const wegcasten. Daher kann es Dir nicht passieren, daß Du damit irrtümlich außer der beabsichtigten Typumwandlung aus Versehen gleich noch ein const mit beseitigst.</p>
<p>const_cast kann nur eine Sache: consts wegmachen.</p>
<p>reinterpret_cast ist der Vorschlaghammer unter den C++-Casts. Nötig für so brachiale Methoden wie mach aus dem int nen Pointer.</p>
<p>dynamic_cast benutzt Typinformationen eines Objektes zum sicheren downcast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1120108</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1120108</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Sat, 19 Aug 2006 07:21:31 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiede im Casting on Sat, 19 Aug 2006 09:52:26 GMT]]></title><description><![CDATA[<p>Vielen Dank!</p>
<p>Also ist <strong>dynamic_cast</strong> am sichersten - ist es auch am schnellsten oder wäre das <strong>static_cast</strong>? Sollte man denn wenn möglich (solange es funtioniert) <strong>dynamic_cast</strong> verwenden? Welche Typinformationen benutzt es denn zum casten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1120162</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1120162</guid><dc:creator><![CDATA[__et_]]></dc:creator><pubDate>Sat, 19 Aug 2006 09:52:26 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiede im Casting on Sat, 19 Aug 2006 09:54:10 GMT]]></title><description><![CDATA[<p>Dynamic_cast kann dein Programm ziemlich ausbremsen. Im allgemeinen solltest du sowiso versuchen <strong>ohne</strong> Casts auszukommen.</p>
<p>grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1120166</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1120166</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Sat, 19 Aug 2006 09:54:10 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiede im Casting on Sat, 19 Aug 2006 10:15:14 GMT]]></title><description><![CDATA[<p>_<em>et</em> schrieb:</p>
<blockquote>
<p>Vielen Dank!</p>
<p>Also ist <strong>dynamic_cast</strong> am sichersten - ist es auch am schnellsten oder wäre das <strong>static_cast</strong>? Sollte man denn wenn möglich (solange es funtioniert) <strong>dynamic_cast</strong> verwenden? Welche Typinformationen benutzt es denn zum casten?</p>
</blockquote>
<p>Die Frage ist falsch gestellt. Wenn du in einer Klassenhierarchie downcasten willst oder musst, dann bleibt dir gar nichts anderes übrig, als einen dynamic_cast zu verwenden (sofern du den C-Cast nicht benutzt). Gleiches gilt für die anderen. Wie Jester schon sagte, hat jeder C++ Cast sein eigenes Anwendungsgebiet, du kannst mit einem static_cast halt kein const wegcasten oder downcasten. Geht net.</p>
<p>MfG</p>
<p>GPC</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1120170</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1120170</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Sat, 19 Aug 2006 10:15:14 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiede im Casting on Sat, 19 Aug 2006 10:50:46 GMT]]></title><description><![CDATA[<p>Okay, ich fragte unter anderem deshalb, weil ich gerade mit einem iterator hantiere und wenn ich das aktuelle Element in das nicht mehr Iterator gekapselte caste funktioniert praktisch alles (C-Cast, reinterpret_cast, static_cast, dynamic_cast). Für den Fall wäre dann static_cast am Sinnvollsten, der?</p>
<p>Kann ich denn einen Iterator benutzen ohne zu casten?</p>
<p>danke <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="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1120188</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1120188</guid><dc:creator><![CDATA[__et_]]></dc:creator><pubDate>Sat, 19 Aug 2006 10:50:46 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiede im Casting on Sat, 19 Aug 2006 11:05:41 GMT]]></title><description><![CDATA[<p>GPC schrieb:</p>
<blockquote>
<p>_<em>et</em> schrieb:</p>
<blockquote>
<p>Vielen Dank!</p>
<p>Also ist <strong>dynamic_cast</strong> am sichersten - ist es auch am schnellsten oder wäre das <strong>static_cast</strong>? Sollte man denn wenn möglich (solange es funtioniert) <strong>dynamic_cast</strong> verwenden? Welche Typinformationen benutzt es denn zum casten?</p>
</blockquote>
<p>Die Frage ist falsch gestellt. Wenn du in einer Klassenhierarchie downcasten willst oder musst, dann bleibt dir gar nichts anderes übrig, als einen dynamic_cast zu verwenden (sofern du den C-Cast nicht benutzt).</p>
</blockquote>
<p>Das stimmt so nicht. In einfachen Hierarchien reicht auch ein static_cast. In solchen Hierarchien liegt der Unterschied zwischen static_cast und dynamic_cast in der Semantik. Der static_cast bedeutet: Hy Compiler, ich *weiß*, dass sich hinter meinem Base-Zeiger ein Derived-Objekt versteckt. Vertrau mir und gibt mir eine passende Referenz.<br />
Ein dynamic_cast hingegen ist mehr: Lieber Compiler, schau doch mal bitte, ob sich hinter dem Base-Zeiger ein Derived-Objekt verbirgt. Falls ja, gib mir eine passende Referenz.</p>
<p>Anders sieht es aus, bei Casts, die nicht eindeutig sind (virtuelle Basisklassen, Mehrfachvererbung). Der folgende Cross-Cast kann z.B. nur per dynamic_cast durchgeführt werden:</p>
<pre><code class="language-cpp">class B {
public:
virtual ~B() {}
};

class C {
public:
virtual ~C() {}
};

class D : public B, public C {
};

int main() {
    B* b = new D;
    C* c = dynamic_cast&lt;C*&gt;(b);
}
</code></pre>
<p>Wie bereits gesagt wurde, verwendet der dynamic_cast Laufzeittypinformationen. Aus diesem Grund kann ein dynamic_cast (im Gegensatz zu einem static_cast) auch nur auf polymorphe Type verwendet werden.</p>
<p>Für Down-Cast halte ich mich an folgende Regeln:<br />
* Der Default-Cast sollte ein dynamic_cast sein</p>
<p>* In Ausnahmefällen, wo man genau weiß, dass der Cast korrekt ist und wo Performanz wichtig ist, verwendet man einen static_cast (Am Besten verpackt hinter einem Wrapper wie z.B. boost::polymorphic_cast)</p>
<p>* einen C-Cast sollte man nicht für Downcasts verwenden, da dieser sowohl wie ein reinterpret_cast (fehlende Klassendefinition), als auch wie ein static_cast (Klassendefinition bekannt) funktionieren kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1120201</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1120201</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Sat, 19 Aug 2006 11:05:41 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiede im Casting on Sat, 19 Aug 2006 16:44:36 GMT]]></title><description><![CDATA[<p>HumeSikkins schrieb:</p>
<blockquote>
<p>GPC schrieb:</p>
<blockquote>
<p>_<em>et</em> schrieb:</p>
<blockquote>
<p>Vielen Dank!</p>
<p>Also ist <strong>dynamic_cast</strong> am sichersten - ist es auch am schnellsten oder wäre das <strong>static_cast</strong>? Sollte man denn wenn möglich (solange es funtioniert) <strong>dynamic_cast</strong> verwenden? Welche Typinformationen benutzt es denn zum casten?</p>
</blockquote>
<p>Die Frage ist falsch gestellt. Wenn du in einer Klassenhierarchie downcasten willst oder musst, dann bleibt dir gar nichts anderes übrig, als einen dynamic_cast zu verwenden (sofern du den C-Cast nicht benutzt).</p>
</blockquote>
<p>Das stimmt so nicht. In einfachen Hierarchien reicht auch ein static_cast. In solchen Hierarchien liegt der Unterschied zwischen static_cast und dynamic_cast in der Semantik. Der static_cast bedeutet: Hy Compiler, ich *weiß*, dass sich hinter meinem Base-Zeiger ein Derived-Objekt versteckt. Vertrau mir und gibt mir eine passende Referenz.<br />
Ein dynamic_cast hingegen ist mehr: Lieber Compiler, schau doch mal bitte, ob sich hinter dem Base-Zeiger ein Derived-Objekt verbirgt. Falls ja, gib mir eine passende Referenz.</p>
</blockquote>
<p>hmm... das wusste ich nicht. Dennoch bin ich über diese Möglichkeit nicht gerade erfreut, da sie die klare Abgenzung der Casts aufweicht. Trotzdem danke für die Info <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="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1120397</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1120397</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Sat, 19 Aug 2006 16:44:36 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiede im Casting on Sat, 19 Aug 2006 17:47:08 GMT]]></title><description><![CDATA[<p>_<em>et</em> schrieb:</p>
<blockquote>
<p>...<br />
Kann ich denn einen Iterator benutzen ohne zu casten?...</p>
</blockquote>
<p>Normalerweise schon. Allerdings geht es dabei weniger um den iterator als vielmehr um den Container, auf dem der iterator arbeitet.<br />
Da Du in C++ (genauer in der STL) aber typisierte Container hast, brauchst Du eigentlich nicht zu casten. Im Gegensatz zu Java kann eben nicht alles Mögliche im Container stecken, sondern in einem vector&lt;string&gt; sind eben garantierterweise auch nur strings drin...</p>
<p>Gib' doch mal das konkrete Beispiel.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1120454</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1120454</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Sat, 19 Aug 2006 17:47:08 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiede im Casting on Sat, 19 Aug 2006 18:11:47 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6287">@GPC</a><br />
Die Fähigkeiten eines static_casts kann man sich recht einfach merken: er kann alle impliziten Konvertierungen umkehren. Daraus ergibt sich auch die Geschichte mit den down-casts.<br />
Wenn du einen Zeiger base vom Typ Base und einen Zeiger derived vom Typ Derived hast und für die Zuweisung base = derived eine implizite (eindeutige) Umwandlung existiert (hier: upcast), dann kann die Gegenrichtung durch einen static_cast durchgeführt werden, also derived = static_cast&lt;Derived*&gt;(base).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1120484</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1120484</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Sat, 19 Aug 2006 18:11:47 GMT</pubDate></item></channel></rss>