<?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[&#x27;reinterpret_cast&#x27; casten von Klassen]]></title><description><![CDATA[<p>Hi Leute,</p>
<p>Mal angenommen ich möchte eine 3D Engine entwickel die sowohl &quot;OpenGL Driver&quot; als auch &quot;Direct3D Driver&quot; anbietet.</p>
<pre><code>pDevice* = createDevice(OPENGL);
</code></pre>
<p>oder</p>
<pre><code>pDevice* = createDevice(DIRECT3D);
</code></pre>
<p>Dann muss der Pointer &quot;pDevice*&quot; entweder vom Typ &quot;class OpenGLDriver&quot; oder &quot;class Direct3DDriver&quot; sein. Das wird aber während der Laufzeit entschieden.</p>
<p>Ich dachte mir das so:</p>
<pre><code>class OpenGLDriver {
    public:
        OpenGLDriver();
        void Print() {
            cout &lt;&lt; &quot;OpenGL&quot; &lt;&lt; endl;
        }
};
class Direct3DDriver {
    public:
        Direct3DDriver();
        void Print() {
            cout &lt;&lt; &quot;Direct3D&quot; &lt;&lt; endl;
        }
};

int main() {

    void* MyDriver = reinterpret_cast&lt;void*&gt;(new OpenGLDriver()); // oder eben &quot;new Direct3DDriver()&quot;
    MyDriver-&gt;Print(); // geht nicht weil das leider kein Objekt sindern ein void* ist =(

    return 0;
}
</code></pre>
<p>Hat aber leider nicht geklappt.<br />
Wie macht man das ohne überall im Programm reinterpret_cast aufrufen zu müssen?</p>
<p>also so will ich das nicht haben weil das überall Zeit kosten würde:</p>
<pre><code>((OpenGLDriver*)MyDriver)-&gt;Print();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/215474/reinterpret_cast-casten-von-klassen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 12 Oct 2026 03:18:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/215474.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 11 Jun 2008 13:30:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to &#x27;reinterpret_cast&#x27; casten von Klassen on Wed, 11 Jun 2008 13:32:37 GMT]]></title><description><![CDATA[<p>Hi Leute,</p>
<p>Mal angenommen ich möchte eine 3D Engine entwickel die sowohl &quot;OpenGL Driver&quot; als auch &quot;Direct3D Driver&quot; anbietet.</p>
<pre><code>pDevice* = createDevice(OPENGL);
</code></pre>
<p>oder</p>
<pre><code>pDevice* = createDevice(DIRECT3D);
</code></pre>
<p>Dann muss der Pointer &quot;pDevice*&quot; entweder vom Typ &quot;class OpenGLDriver&quot; oder &quot;class Direct3DDriver&quot; sein. Das wird aber während der Laufzeit entschieden.</p>
<p>Ich dachte mir das so:</p>
<pre><code>class OpenGLDriver {
    public:
        OpenGLDriver();
        void Print() {
            cout &lt;&lt; &quot;OpenGL&quot; &lt;&lt; endl;
        }
};
class Direct3DDriver {
    public:
        Direct3DDriver();
        void Print() {
            cout &lt;&lt; &quot;Direct3D&quot; &lt;&lt; endl;
        }
};

int main() {

    void* MyDriver = reinterpret_cast&lt;void*&gt;(new OpenGLDriver()); // oder eben &quot;new Direct3DDriver()&quot;
    MyDriver-&gt;Print(); // geht nicht weil das leider kein Objekt sindern ein void* ist =(

    return 0;
}
</code></pre>
<p>Hat aber leider nicht geklappt.<br />
Wie macht man das ohne überall im Programm reinterpret_cast aufrufen zu müssen?</p>
<p>also so will ich das nicht haben weil das überall Zeit kosten würde:</p>
<pre><code>((OpenGLDriver*)MyDriver)-&gt;Print();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1527054</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1527054</guid><dc:creator><![CDATA[LukasBanana]]></dc:creator><pubDate>Wed, 11 Jun 2008 13:32:37 GMT</pubDate></item><item><title><![CDATA[Reply to &#x27;reinterpret_cast&#x27; casten von Klassen on Wed, 11 Jun 2008 13:32:54 GMT]]></title><description><![CDATA[<p>-Vererbung ?<br />
-Templates ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1527057</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1527057</guid><dc:creator><![CDATA[DataByte]]></dc:creator><pubDate>Wed, 11 Jun 2008 13:32:54 GMT</pubDate></item><item><title><![CDATA[Reply to &#x27;reinterpret_cast&#x27; casten von Klassen on Wed, 11 Jun 2008 13:36:15 GMT]]></title><description><![CDATA[<p>Gute, Idee! Aber sind virtuelle Funktionen nicht etwas langsamer als normale?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1527062</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1527062</guid><dc:creator><![CDATA[LukasBanana]]></dc:creator><pubDate>Wed, 11 Jun 2008 13:36:15 GMT</pubDate></item><item><title><![CDATA[Reply to &#x27;reinterpret_cast&#x27; casten von Klassen on Wed, 11 Jun 2008 14:19:53 GMT]]></title><description><![CDATA[<p>LukasBanana schrieb:</p>
<blockquote>
<p>Gute, Idee! Aber sind virtuelle Funktionen nicht etwas langsamer als normale?</p>
</blockquote>
<p>Nein, nicht unbedingt. Es wird minimal mehr Speicher benötigt. Aber das ist kein Grund sie nicht dort einzusetzen, wo man sie braucht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1527098</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1527098</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 11 Jun 2008 14:19:53 GMT</pubDate></item><item><title><![CDATA[Reply to &#x27;reinterpret_cast&#x27; casten von Klassen on Wed, 11 Jun 2008 14:25:23 GMT]]></title><description><![CDATA[<p>sie sind kaum langsamer. das device wird normalerweise eh nur einmal am anfang des programms erstellt, da macht es gar nichts aus. du kannst dich aber mal mit <a href="http://en.wikipedia.org/wiki/Policy-based_design" rel="nofollow">policy based design</a> beschäftigen, um eine weitere möglichkeit von c++ kennen zu lernen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1527102</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1527102</guid><dc:creator><![CDATA[pocily]]></dc:creator><pubDate>Wed, 11 Jun 2008 14:25:23 GMT</pubDate></item><item><title><![CDATA[Reply to &#x27;reinterpret_cast&#x27; casten von Klassen on Wed, 11 Jun 2008 14:27:46 GMT]]></title><description><![CDATA[<p>LukasBanana schrieb:</p>
<blockquote>
<p>Gute, Idee! Aber sind virtuelle Funktionen nicht etwas langsamer als normale?</p>
</blockquote>
<p>Warum sollten sie? Was zusätzliche Zeit kosten kann, ist die Auswahl der richtigen Funktion basierend auf dem dynamischen Typ des Objektes, für das sie aufgerufen wird. Eine solche Auswahl musst du für dein Problem aber in jedem Falle durchführen - darum geht es ja gerade - und es gibt keine Grund anzunehmen, dass der virtuelle Aufrufmechanismus <em>per se</em> langsamer sein wird als etwas Handgestricktes.</p>
<p>Was das reinterpret_cast hier zu suchen hat, entzieht sich meinem Verständnis.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1527104</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1527104</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 11 Jun 2008 14:27:46 GMT</pubDate></item><item><title><![CDATA[Reply to &#x27;reinterpret_cast&#x27; casten von Klassen on Wed, 11 Jun 2008 14:34:59 GMT]]></title><description><![CDATA[<p>LukasBanana schrieb:</p>
<blockquote>
<p>Gute, Idee! Aber sind virtuelle Funktionen nicht etwas langsamer als normale?</p>
</blockquote>
<p>Bestimmt nicht langsamer als ein manueller Typ-Vergleich und ein nomaler call. <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>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1527109</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1527109</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 11 Jun 2008 14:34:59 GMT</pubDate></item><item><title><![CDATA[Reply to &#x27;reinterpret_cast&#x27; casten von Klassen on Wed, 11 Jun 2008 14:48:54 GMT]]></title><description><![CDATA[<p>Okay, danke für eure Hilfe! <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>
<p>So funktioniert's jetzt:</p>
<pre><code>class NullDriver
{
    public:
        NullDriver() {}
        virtual void Print()
        {
            cout &lt;&lt; &quot;Null!&quot; &lt;&lt; endl;
        }
};
class OpenGLDriver : public NullDriver
{
    public:
        OpenGLDriver() {}
        virtual void Print()
        {
            cout &lt;&lt; &quot;OpenGL!&quot; &lt;&lt; endl;
        }
};
class Direct3D9Driver : public NullDriver
{
    public:
        Direct3D9Driver() {}
        virtual void Print()
        {
            cout &lt;&lt; &quot;Direct3D9!&quot; &lt;&lt; endl;
        }
};

int main() {

    NullDriver* MyDriver;
    MyDriver = reinterpret_cast&lt;OpenGLDriver*&gt;(new OpenGLDriver()); // oder eben wieder &quot;new Direct3DDriver()&quot;
    MyDriver-&gt;Print();

    return 0;
}
</code></pre>
<p>Gruß Lukas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1527118</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1527118</guid><dc:creator><![CDATA[LukasBanana]]></dc:creator><pubDate>Wed, 11 Jun 2008 14:48:54 GMT</pubDate></item><item><title><![CDATA[Reply to &#x27;reinterpret_cast&#x27; casten von Klassen on Wed, 11 Jun 2008 14:55:40 GMT]]></title><description><![CDATA[<p>pocily schrieb:</p>
<blockquote>
<p>das device wird normalerweise eh nur einmal am anfang des programms erstellt, da macht es gar nichts aus.</p>
</blockquote>
<p>das war ein denkfehler. es geht ja nicht um virtuelle methoden einer factory, sonder um die des erstellten device. es wird sich aber trotzdem kaum bemerkbar machen und erst recht nicht, wenn du anstattdessen herumcasten muss. das reinterpret_cast kannst du weglassen, aber du solltest einen virtuellen destruktor bei klassen mit virtuellen methoden verwenden, damit der destruktur der subklassen aufgerufen wird, wenn du delete auf einen basisklassenzeiger anwendest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1527121</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1527121</guid><dc:creator><![CDATA[pocily]]></dc:creator><pubDate>Wed, 11 Jun 2008 14:55:40 GMT</pubDate></item><item><title><![CDATA[Reply to &#x27;reinterpret_cast&#x27; casten von Klassen on Wed, 11 Jun 2008 15:20:01 GMT]]></title><description><![CDATA[<p>hier mal ein kleines beispiel, wie du es mit virtuellen methoden laufzeit-flexibel und gleichzeitig mit policies compilezeit-flexibel machen kannst:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
using namespace std;

class IDevice
{
public:
    virtual ~IDevice(){}
    virtual void printAPIName() = 0;
};

template&lt;typename T&gt;
class Device : public T, public IDevice
{
    typedef T api_policy;

public:
    void printAPIName() { cout &lt;&lt; api_policy::getAPIName(); }
};

class Direct3DPolicy
{
protected:
	string getAPIName()	{ return &quot;Direct3D API Policy&quot;; }
};

class OpenGLPolicy
{
protected:
	string getAPIName()	{ return &quot;OpenGL API Policy&quot;; }
};

int main()
{
    int iSelection;
    IDevice *myDevice;

    cout &lt;&lt; &quot;[1]Direct3D\n[2]OpenGL\n&quot;;
    cin &gt;&gt; iSelection;

    if (iSelection == 1)
        myDevice = new Device&lt;Direct3DPolicy&gt;;
    else if (iSelection == 2)
        myDevice = new Device&lt;OpenGLPolicy&gt;;
    else
        return 1;

    myDevice-&gt;printAPIName();

    //IDevice hat einen virtuellen Destruktor, 
    //denn nur so wird mit &quot;delete einenIDeviceZeiger&quot; auch der 
    //dynamisch angeforderte Device&lt;...&gt; Speicher freigegeben.
    delete myDevice; 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1527141</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1527141</guid><dc:creator><![CDATA[pocily]]></dc:creator><pubDate>Wed, 11 Jun 2008 15:20:01 GMT</pubDate></item><item><title><![CDATA[Reply to &#x27;reinterpret_cast&#x27; casten von Klassen on Wed, 11 Jun 2008 16:25:20 GMT]]></title><description><![CDATA[<p>Hi Lukas,</p>
<p>zu Deinem Code:</p>
<p>• lass das 'reinterpret_cast' weg, das ist an dieser Stelle sinnfrei und irreführend.<br />
• der NullDriver sollte keine Implementierung für 'print' haben. Schau Dir mal pur virtuelle Funktionen an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1527174</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1527174</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Wed, 11 Jun 2008 16:25:20 GMT</pubDate></item><item><title><![CDATA[Reply to &#x27;reinterpret_cast&#x27; casten von Klassen on Thu, 12 Jun 2008 17:44:28 GMT]]></title><description><![CDATA[<p>alles klar, danke noch mal an alle <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/1527961</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1527961</guid><dc:creator><![CDATA[LukasBanana]]></dc:creator><pubDate>Thu, 12 Jun 2008 17:44:28 GMT</pubDate></item><item><title><![CDATA[Reply to &#x27;reinterpret_cast&#x27; casten von Klassen on Thu, 12 Jun 2008 18:22:53 GMT]]></title><description><![CDATA[<p>LukasBanana schrieb:</p>
<blockquote>
<p>Gute, Idee! Aber sind virtuelle Funktionen nicht etwas langsamer als normale?</p>
</blockquote>
<p>Da sieht man mal was diese ganzen Pseudooptimierungsaussagen anrichten können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1527981</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1527981</guid><dc:creator><![CDATA[Ohje]]></dc:creator><pubDate>Thu, 12 Jun 2008 18:22:53 GMT</pubDate></item><item><title><![CDATA[Reply to &#x27;reinterpret_cast&#x27; casten von Klassen on Thu, 12 Jun 2008 18:32:54 GMT]]></title><description><![CDATA[<p>Bei einem Spiel sind virtuelle Metthoden inakzeptabel.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1527988</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1527988</guid><dc:creator><![CDATA[asdfasdf]]></dc:creator><pubDate>Thu, 12 Jun 2008 18:32:54 GMT</pubDate></item><item><title><![CDATA[Reply to &#x27;reinterpret_cast&#x27; casten von Klassen on Thu, 12 Jun 2008 18:52:33 GMT]]></title><description><![CDATA[<p>asdfasdf schrieb:</p>
<blockquote>
<p>Bei einem Spiel sind virtuelle Metthoden inakzeptabel.</p>
</blockquote>
<p>So ein Mist. Bei einem Spiel hast du ganz andere Sorgen, als ein paar virtuelle Methoden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1527998</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1527998</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 12 Jun 2008 18:52:33 GMT</pubDate></item><item><title><![CDATA[Reply to &#x27;reinterpret_cast&#x27; casten von Klassen on Thu, 12 Jun 2008 22:49:36 GMT]]></title><description><![CDATA[<p>LukasBanana schrieb:</p>
<blockquote>
<p>Gute, Idee! Aber sind virtuelle Funktionen nicht etwas langsamer als normale?</p>
</blockquote>
<p>Du bist nicht echt, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1528118</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1528118</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 12 Jun 2008 22:49:36 GMT</pubDate></item><item><title><![CDATA[Reply to &#x27;reinterpret_cast&#x27; casten von Klassen on Fri, 13 Jun 2008 07:15:30 GMT]]></title><description><![CDATA[<p>asdfasdf schrieb:</p>
<blockquote>
<p>Bei einem Spiel sind virtuelle Metthoden inakzeptabel.</p>
</blockquote>
<p>Beim Programmieren ist ein Spiel inakzeptabel.</p>
<p>Jede Aussage ist gleichzeitig richtig und falsch, wenn man sie nur ausreichend verkürzt, pauschalisiert und komplett kontext- und Begründingsfrei präsentiert.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1528201</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1528201</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Fri, 13 Jun 2008 07:15:30 GMT</pubDate></item><item><title><![CDATA[Reply to &#x27;reinterpret_cast&#x27; casten von Klassen on Fri, 13 Jun 2008 07:40:31 GMT]]></title><description><![CDATA[<blockquote>
<p>Bei einem Spiel sind virtuelle Metthoden inakzeptabel.</p>
</blockquote>
<p>lol.. das erinnert mich als an HL2 <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="😉"
    /> wenn ich das zocke, kommt ganz selten mal eine error fenster mit der melden &quot;Error: Pure Virtual Function call&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="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1528212</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1528212</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Fri, 13 Jun 2008 07:40:31 GMT</pubDate></item><item><title><![CDATA[Reply to &#x27;reinterpret_cast&#x27; casten von Klassen on Fri, 13 Jun 2008 14:56:32 GMT]]></title><description><![CDATA[<p>Also dass virtuelle Funktionen bei Spielen inakzeptabel sein sollen würde mich aber schon sehr wundern <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>Bloß ich weiß nicht, ob sich die virtuellen Funktionen den FunktionsZeiger (auf welche Funktion zu welcher Unterklasse sie nun zeigen) nur beim ersten Mal holen müssen oder bei jedem Aufruf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1528470</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1528470</guid><dc:creator><![CDATA[LukasBanana]]></dc:creator><pubDate>Fri, 13 Jun 2008 14:56:32 GMT</pubDate></item><item><title><![CDATA[Reply to &#x27;reinterpret_cast&#x27; casten von Klassen on Fri, 13 Jun 2008 14:58:09 GMT]]></title><description><![CDATA[<p>LukasBanana schrieb:</p>
<blockquote>
<p>Bloß ich weiß nicht, ob sich die virtuellen Funktionen den FunktionsZeiger (auf welche Funktion zu welcher Unterklasse sie nun zeigen) nur beim ersten Mal holen müssen oder bei jedem Aufruf.</p>
</blockquote>
<p>Prinzipiell jedes Mal. Wie stellst Du Dir das sonst vor?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1528473</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1528473</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Fri, 13 Jun 2008 14:58:09 GMT</pubDate></item></channel></rss>