<?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[Pointer type casting]]></title><description><![CDATA[<p>hallo,</p>
<pre><code>class A { void funkA(); };
class B { void funkB(); };
A * a = new A;
B * b = reinterpret_cast&lt;B*&gt;(a);

b-&gt;funkA();   // Geht das
</code></pre>
<p>ein reinterpret_cast führt ja einen total unsinnigen Cast durch. Die beiden Klassen haben ja nichts miteinander zu tun.<br />
Kann man nun sowas hier durchführen b-&gt;funkA();</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/339449/pointer-type-casting</link><generator>RSS for Node</generator><lastBuildDate>Sun, 12 Apr 2026 04:14:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/339449.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 30 Aug 2016 14:18:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Pointer type casting on Tue, 30 Aug 2016 14:18:04 GMT]]></title><description><![CDATA[<p>hallo,</p>
<pre><code>class A { void funkA(); };
class B { void funkB(); };
A * a = new A;
B * b = reinterpret_cast&lt;B*&gt;(a);

b-&gt;funkA();   // Geht das
</code></pre>
<p>ein reinterpret_cast führt ja einen total unsinnigen Cast durch. Die beiden Klassen haben ja nichts miteinander zu tun.<br />
Kann man nun sowas hier durchführen b-&gt;funkA();</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2507107</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2507107</guid><dc:creator><![CDATA[Ibinda100]]></dc:creator><pubDate>Tue, 30 Aug 2016 14:18:04 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer type casting on Tue, 30 Aug 2016 14:23:23 GMT]]></title><description><![CDATA[<p>Ibinda100 schrieb:</p>
<blockquote>
<p>total unsinnigen</p>
</blockquote>
<p>Was folgt wohl aus Unsinn?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2507108</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2507108</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Tue, 30 Aug 2016 14:23:23 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer type casting on Tue, 30 Aug 2016 14:29:46 GMT]]></title><description><![CDATA[<p>keine Ahnung. Für reinterpret_cast muss es doch eine Verwendung geben.</p>
<pre><code>b-&gt;funkA();   // Geht das
b-&gt;funkB();   // Geht das
</code></pre>
<p>Was davon geht nun ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2507109</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2507109</guid><dc:creator><![CDATA[Ibinda100]]></dc:creator><pubDate>Tue, 30 Aug 2016 14:29:46 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer type casting on Tue, 30 Aug 2016 14:46:18 GMT]]></title><description><![CDATA[<p>&quot;Nimm dir ein Objekt A, presse es auf ein Interface von B, und dann rufe eine Funktion auf, die nur das Interface A kennt - obwohl ich gerade eben noch gesagt habe, dass das Interface von B ist&quot;.</p>
<p>Merkste selbst, dass das nicht geht, wa?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2507111</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2507111</guid><dc:creator><![CDATA[dachschaden]]></dc:creator><pubDate>Tue, 30 Aug 2016 14:46:18 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer type casting on Tue, 30 Aug 2016 14:55:22 GMT]]></title><description><![CDATA[<p>also beides geht praktisch nicht.</p>
<p>Reinterprete macht wohl auch nur bei derived und base Sinn ?<br />
Oder schreib mir mal nen Code bei dem reinterpret_cast funktioniert .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2507112</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2507112</guid><dc:creator><![CDATA[Ibinda100]]></dc:creator><pubDate>Tue, 30 Aug 2016 14:55:22 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer type casting on Tue, 30 Aug 2016 16:05:33 GMT]]></title><description><![CDATA[<p>Ibinda100 schrieb:</p>
<blockquote>
<p>Reinterprete macht wohl auch nur bei derived und base Sinn ?</p>
</blockquote>
<p>Nein, da erst recht nicht. Die Typen sind dann doch schon kompatibel.</p>
<blockquote>
<p>Oder schreib mir mal nen Code bei dem reinterpret_cast funktioniert .</p>
</blockquote>
<p>reinterpret_cast brauchst du, wenn vorher etwas mächtig schief ging und durch falsche/schlechte Interfaces Typinformation verloren gegangen ist. Das heißt, um dir ein Beispiel zu zeigen, wo man reinterpret_cast wirklich braucht, müssen wir dir ein Beispiel zeigen für etwas, wie man es <em>nicht</em> richtig macht. Das heißt, den reinterpret_cast brauchst du, wenn du es mit fremdem, schlechten Code zu tun hast. Ein Beispiel wäre ein C-Interface für Callbacks, welches aus irgendwelchen Gründen keine void*, sondern irgendwelchen eigenen Datentypen einsetzt.</p>
<p>Ein anderes Beispiel wäre, wenn du wirklich Tricksen möchtest und wirklich einen Typen mit einem fremden Interface ansprechen möchtest. Ein berühmtes Beispiel ist die Quake3 inverse Wurzel, bei der ein float durch die Integereinheit des Prozessors gejagt wird. Das Original ist in C geschrieben, aber so könnte es in C++ aussehen:</p>
<pre><code>float Q_rsqrt( float number )
{
    long i;
    float x2, y;
    const float threehalfs = 1.5F;

    x2 = number * 0.5F;
    y  = number;
    i  = * reinterpret_cast&lt;long *&gt;(&amp;y);      
    i  = 0x5f3759df - ( i &gt;&gt; 1 );        
    y  = * reinterpret_cast&lt;float *&gt;(&amp;i);
    y  = y * ( threehalfs - ( x2 * y * y ) );  

    return y;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2507114</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2507114</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 30 Aug 2016 16:05:33 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer type casting on Tue, 30 Aug 2016 18:31:38 GMT]]></title><description><![CDATA[<p>@Ibinda100<br />
<code>reinterpret_cast</code> kann man verwenden um z.B. einen Zeiger in einen <code>uintptr_t</code> zu konvertieren - und wieder zurück (in genau den selben Zeigertyp!).<br />
Das ist soweit ich weiss OK und vom Standard abgedeckt.</p>
<p>Weiters kann man <code>reinterpret_cast</code> verwenden um z.B. einen <code>T*</code> in einen <code>char*</code> oder <code>unsigned char*</code> zu verwandeln. Um dann z.B. byteweise zu kopieren. Das ist auch OK -- vorausgesetzt <code>T</code> ist dafür geeignet (memcpy-movable bzw. memcpy-copyable). Ebenfalls OK und vom Standard abgedeckt.</p>
<p>Code wie in dem Beispiel von SeppJ sieht man auch oft. Der verletzt aber blöderweise die &quot;strict aliasing&quot; Regel, ist also nicht standardkonform, und kann zu UB führen. Also dazu dass das Programm nicht das macht was man erreichen wollte. Je nach Compiler geht das oft bis immer gut (MSVC) oder auch eher nicht (GCC, Clang).</p>
<p>Die standardkonforme Variante davon wäre den <code>float</code> mittels eines <code>char*</code> oder <code>unsigned char*</code> in eine <code>long</code> Variable zu kopieren -- oder auch einfach per <code>memcpy</code> (und dann ebenso wieder zurück). Dummerweise kann man sich nicht darauf verlassen dass der jeweils verwendete Compiler sowas immer perfekt wegoptimiert, und daher wird oft die &quot;verbotene&quot; Variante mit <code>reinterpret_cast</code> verwendet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2507120</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2507120</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 30 Aug 2016 18:31:38 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer type casting on Tue, 30 Aug 2016 20:38:46 GMT]]></title><description><![CDATA[<p>Oder wenn nur ein Offset einer Funktion in einem Modul bekannt ist, dann kann man die Funktion mit dem hier verfügbar machen:</p>
<pre><code>using func_t = int WINAPI (*)(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType);
std::size_t start_addr = reinterpret_cast&lt;std::size_t&gt;(GetModuleHandle(&quot;Kernel.dll&quot;));
func_t MessageBox = reinterpret_cast&lt;func_t&gt;(start_addr + offset)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2507133</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2507133</guid><dc:creator><![CDATA[JulianH]]></dc:creator><pubDate>Tue, 30 Aug 2016 20:38:46 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer type casting on Wed, 31 Aug 2016 08:25:41 GMT]]></title><description><![CDATA[<p>welchen Vorteil bringt mir eigentlich</p>
<pre><code>Derived* ptr_derived = dynamic_cast&lt;Derived*&gt;(ptr_base);
</code></pre>
<p>gegenüber</p>
<pre><code>Derived*  ptr_derived = (Derived) ptr_base;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2507155</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2507155</guid><dc:creator><![CDATA[Ibinda100]]></dc:creator><pubDate>Wed, 31 Aug 2016 08:25:41 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer type casting on Wed, 31 Aug 2016 08:32:34 GMT]]></title><description><![CDATA[<p>Ibinda100 schrieb:</p>
<blockquote>
<p>welchen Vorteil bringt mir eigentlich</p>
<pre><code>Derived* ptr_derived = dynamic_cast&lt;Derived*&gt;(ptr_base);
</code></pre>
<p>gegenüber</p>
<pre><code>Derived*  ptr_derived = (Derived) ptr_base;
</code></pre>
</blockquote>
<p>Im ersten Fall macht es genau das was dort steht oder meldet einen Fehler. Im zweiten Fall würde irgendetwas ausgeführt (vermutlich würde es sogar ohne den vergessenen * übersetzen). Welcher cast ausgeführt wird, lässt sich nur anhand der Zeilen nicht vorhersagen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2507158</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2507158</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Wed, 31 Aug 2016 08:32:34 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer type casting on Wed, 31 Aug 2016 08:49:49 GMT]]></title><description><![CDATA[<p>(1)Derived* ptr_derived = dynamic_cast&lt;Derived*&gt;(ptr_base);</p>
<p>(2)Base* ptr_base = dynamic_cast&lt;Base*&gt;(ptr_derived);</p>
<p>Macht das 2.nicht mehr Sinn ? In einer derived klasse sind doch meistens viel mehr Methoden verfügbar. ptr_derived kann aber im 1.Fall nur die base methoden aufrufen. Das Intellisense der IDE würde wahrscheinlich aber alle Methoden (Base + Derived) anzeigen oder.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2507162</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2507162</guid><dc:creator><![CDATA[Ibinda100]]></dc:creator><pubDate>Wed, 31 Aug 2016 08:49:49 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer type casting on Wed, 31 Aug 2016 09:03:49 GMT]]></title><description><![CDATA[<p>Vielleicht stellst du deine Hausaufgaben mal komplett ein, dann können wir sie abarbeiten und dir gesammelt zur Verfügung stellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2507164</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2507164</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Wed, 31 Aug 2016 09:03:49 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer type casting on Wed, 31 Aug 2016 10:01:45 GMT]]></title><description><![CDATA[<p>ja da hab ich schon recht.</p>
<pre><code>Base_Class * ptr_b = new Base_Class;
Derived_Class * ptr_c = dynamic_cast&lt; Derived_Class *&gt;(ptr_b);
</code></pre>
<p>Das hier geht schief , da ptr_c auf ein unvollständiges Objekt zeigen würde.Ein derived pointer kann nie auf eine Base adresse zeigen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2507170</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2507170</guid><dc:creator><![CDATA[Ibinda100]]></dc:creator><pubDate>Wed, 31 Aug 2016 10:01:45 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer type casting on Wed, 31 Aug 2016 13:10:10 GMT]]></title><description><![CDATA[<p>Ibinda100 schrieb:</p>
<blockquote>
<p>Das hier geht schief , da ptr_c auf ein unvollständiges Objekt zeigen würde.Ein derived pointer kann nie auf eine Base adresse zeigen.</p>
</blockquote>
<p>nichts &quot;geht schief&quot;, da <code>dynamic_cast</code> hier einen <code>nullptr</code> zurückgibt. ein <code>dynamic_cast</code> überprüft zur laufzeit, welchen typ ein objekt, auf das ein zeiger oder eine referenz verweist, <em>tatsächlich</em> hat, sofern das vorgesehen ist (das ist es nur, wenn das objekt eine instanz einer polymorphen klasse ist, und das ist eine klasse dann, wenn sie zumindest eine virtuelle funktion deklariert), und kann einen &quot;downcast&quot; dann sicher ausführen. kein anderer cast kann das. das umgekehrte beispiel löst man in der regel implizit oder mit einem <code>static_cast</code> .</p>
<pre><code class="language-cpp">Base* a = new Derived;

Base* b = static_cast&lt;Base*&gt;(new Derived);
//ist äquivalent und besser als
Base* b = dynamic_cast&lt;Base*&gt;(new Derived)
</code></pre>
<p>solltest du als programmierer aber schon ganz sicher wissen, dass ein zeiger auf Base eigentlich auf ein Derived zeigt, dann kannst du auch in diesem fall <code>static_cast</code> verwenden:</p>
<pre><code class="language-cpp">namespace {

   void dumb (Base* b) {
     Derived* d = static_cast&lt;Derived*&gt;(b);
   }

}

void foo (Derived*d) { dumb(d); }
</code></pre>
<p>dumm, weil unnötig, nicht erweiterbar, etc.<br />
[/cpp]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2507200</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2507200</guid><dc:creator><![CDATA[dove]]></dc:creator><pubDate>Wed, 31 Aug 2016 13:10:10 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer type casting on Thu, 01 Sep 2016 11:02:53 GMT]]></title><description><![CDATA[<p>ok dynamic_cast ist klar. Es wird zur Laufzeit geprüft ob der cast funktioniert.</p>
<p>Aber welche Vorteile habe ich mit static_cast,reinterpret_cast oder const_cast gegenüber einem regulären C cast.</p>
<p>Der reguläre C cast vereint ja alle 3 sachen. Man kann halt das Casten noch verfeinern. Man sagt dem Compiler noch genauer was man vorhat oder ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2507333</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2507333</guid><dc:creator><![CDATA[Ibinda100]]></dc:creator><pubDate>Thu, 01 Sep 2016 11:02:53 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer type casting on Thu, 01 Sep 2016 11:21:33 GMT]]></title><description><![CDATA[<p>Ibinda100 schrieb:</p>
<blockquote>
<p>Man sagt dem Compiler noch genauer was man vorhat oder ?</p>
</blockquote>
<p>Genau. Und das hilft, um Fehler früher aufzudecken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2507337</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2507337</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Thu, 01 Sep 2016 11:21:33 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer type casting on Thu, 01 Sep 2016 12:31:42 GMT]]></title><description><![CDATA[<p>und der cast ist im Code besser zu erkennen. Eine ordentliche IDE hebt sowas per Syntaxhighlighting hervor. Man könnte sogar danach suchen wenn man denn möchte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2507346</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2507346</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 01 Sep 2016 12:31:42 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer type casting on Thu, 01 Sep 2016 13:49:53 GMT]]></title><description><![CDATA[<p>@Ibinda100<br />
Bei vielen Sachen ist es ein Vorteil wenn man so wenig wie möglich explizit hinschreiben muss, und der Compiler macht es einfach so dass es passt/geht. Wie z.B. bei <code>auto</code> .<br />
Bei Casts sehe ich das aber anders. Casts sind grundsätzlich eher mit Vorsicht zu geniessen. Man kann damit viel Unsinn bauen. Und da ist es gut wenn man das was der Compiler machen darf möglichst weit einschränken kann. Ein <code>static_cast</code> kann z.B. weder <code>const</code> wegcasten noch zwischen Zeigern auf unverwandte Klassen konvertieren. Und das ist gut. Weil es Fehler vermeidet. Speziell in Templates, aber grundsätzlich auch in ganz normalem Code.</p>
<p>ps: Das was Braunstein geschrieben hat ist mir persönlich auch wichtig. Also Syntax-Highlighting und Suchbarkeit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2507355</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2507355</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 01 Sep 2016 13:49:53 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer type casting on Thu, 01 Sep 2016 14:09:28 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>@Ibinda100<br />
Bei vielen Sachen ist es ein Vorteil wenn man so wenig wie möglich explizit hinschreiben muss, und der Compiler macht es einfach so dass es passt/geht. Wie z.B. bei <code>auto</code> .</p>
</blockquote>
<p>ich bin mir sicher, dass du das auch so siehst: die logik dahinter, die casts so kompliziert zu machen ist die gleiche, die dazu führt, so etwas wie auto zu verwenden: so lange es (typ-)sicher ist, so wenig denkarbeit wie möglich zu verlangen - und dann kann der compiler es einfach so machen, dass es passt/geht. wenn etwas, was der programmierer will, aber unsicher, gefährlich, unüberlegt oder dumm ist, dann (nicht verbieten, wie in anderen sprachen) zumindest hässlich und aufwändig machen (&quot; <code>reinterpret_cast</code> &quot;)</p>
<p>das prinzip ist: je mehr tippen man muss, desto länger kann man sich die frage stellen &quot;will ich das wirklich? gibt es nicht eine bessere alternative?&quot;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2507360</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2507360</guid><dc:creator><![CDATA[dove]]></dc:creator><pubDate>Thu, 01 Sep 2016 14:09:28 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer type casting on Thu, 01 Sep 2016 14:47:02 GMT]]></title><description><![CDATA[<p>Nein, sehe ich nicht ganz so. Also falls ich dich richtig verstanden habe.<br />
MMn. ist der wichtigere Punkt wirklich dass man speziell nur bestimmte Dinge erlauben kann, und nicht dass es hässlich und viel zu tippen ist.</p>
<p>Mir geht z.B. sogar noch ein Cast ab: <code>implicit_cast</code> .<br />
Ala</p>
<pre><code class="language-cpp">implicit_cast&lt;MyInterface*&gt;(p)-&gt;MyInterfaceFunction();

// statt

MyInterface* pmi = p;
pmi-&gt;MyInterfaceFunction();
</code></pre>
<p>Also einen Cast der nur Konvertierungen erlaubt die als implizite Konvertierungen erlaubt wären. <code>static_cast</code> würde hier zu viel erlauben. <code>implicit_cast</code> wäre hier mMn. also nicht besser weil es länger zu tippen ist als <code>static_cast</code> , sondern weil es mehr unerwünschte Casts verbietet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2507368</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2507368</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 01 Sep 2016 14:47:02 GMT</pubDate></item></channel></rss>