<?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[Methodenzeiger casten]]></title><description><![CDATA[<p>Folgender Code ist nicht schön, das weiß ich selber <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="😉"
    /><br />
Aber der bisher verwendete Code ist noch viel unschöner.</p>
<p>Funktioniert der Code so oder ist das abhängig vom Compiler?<br />
Im BCC32 vom Embarcadero C++Builder XE2 tut der Code was er soll.</p>
<p>In der Anwendung die den Code verwenden soll ist sichergestellt, dass die Methodenzeiger nur mit Instanzen der passenden Klassen gerufen werden.</p>
<pre><code>#include &lt;tchar.h&gt;
#include &lt;iostream&gt;

class A
{
public:
   virtual void M1(int i)
   {
      std::cout &lt;&lt; &quot;A:M1 &quot; &lt;&lt; i &lt;&lt; &quot;\n&quot;; 
   }
};

class B :public A
{
public:
   virtual void M1(int i)
   {
      std::cout &lt;&lt; &quot;B:M1 &quot; &lt;&lt; i &lt;&lt; &quot;\n&quot;;  
   }
   virtual void M2(int i)
   {
      std::cout &lt;&lt; &quot;B:M2 &quot; &lt;&lt; i &lt;&lt; &quot;\n&quot;; 
   }
};

typedef void (A::*AddFN)(int);

int _tmain(int argc, _TCHAR* argv[])
{
   A a;
   B b;
   AddFN FN = &amp;A::M1;
   A* obj = &amp;a;
   (obj-&gt;*FN)(5);
   obj=&amp;b;
   (obj-&gt;*FN)(5);
   FN = reinterpret_cast&lt;void (A::*)(int)&gt;(&amp;B::M2);
   (obj-&gt;*FN)(6);

   // das knallt natürlich
   //obj = &amp;a;
   //(obj-&gt;*FN)(6);

   char ch;
   std::cin &gt;&gt; ch;
	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/317772/methodenzeiger-casten</link><generator>RSS for Node</generator><lastBuildDate>Tue, 28 Jul 2026 14:21:29 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/317772.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 20 Jun 2013 10:23:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Methodenzeiger casten on Thu, 20 Jun 2013 19:02:49 GMT]]></title><description><![CDATA[<p>Folgender Code ist nicht schön, das weiß ich selber <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="😉"
    /><br />
Aber der bisher verwendete Code ist noch viel unschöner.</p>
<p>Funktioniert der Code so oder ist das abhängig vom Compiler?<br />
Im BCC32 vom Embarcadero C++Builder XE2 tut der Code was er soll.</p>
<p>In der Anwendung die den Code verwenden soll ist sichergestellt, dass die Methodenzeiger nur mit Instanzen der passenden Klassen gerufen werden.</p>
<pre><code>#include &lt;tchar.h&gt;
#include &lt;iostream&gt;

class A
{
public:
   virtual void M1(int i)
   {
      std::cout &lt;&lt; &quot;A:M1 &quot; &lt;&lt; i &lt;&lt; &quot;\n&quot;; 
   }
};

class B :public A
{
public:
   virtual void M1(int i)
   {
      std::cout &lt;&lt; &quot;B:M1 &quot; &lt;&lt; i &lt;&lt; &quot;\n&quot;;  
   }
   virtual void M2(int i)
   {
      std::cout &lt;&lt; &quot;B:M2 &quot; &lt;&lt; i &lt;&lt; &quot;\n&quot;; 
   }
};

typedef void (A::*AddFN)(int);

int _tmain(int argc, _TCHAR* argv[])
{
   A a;
   B b;
   AddFN FN = &amp;A::M1;
   A* obj = &amp;a;
   (obj-&gt;*FN)(5);
   obj=&amp;b;
   (obj-&gt;*FN)(5);
   FN = reinterpret_cast&lt;void (A::*)(int)&gt;(&amp;B::M2);
   (obj-&gt;*FN)(6);

   // das knallt natürlich
   //obj = &amp;a;
   //(obj-&gt;*FN)(6);

   char ch;
   std::cin &gt;&gt; ch;
	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2332741</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2332741</guid><dc:creator><![CDATA[MichelRT]]></dc:creator><pubDate>Thu, 20 Jun 2013 19:02:49 GMT</pubDate></item><item><title><![CDATA[Reply to Methodenzeiger casten on Thu, 20 Jun 2013 10:40:06 GMT]]></title><description><![CDATA[<p>MichelRT schrieb:</p>
<blockquote>
<p>Funktioniert der Code so oder ist das abhängig vom Compiler?</p>
</blockquote>
<p>Letzteres, weil der falsche Cast verwendet wird. Hier ist static_cast angebracht. Für die Umgekehrung impliziter Konvertierungun ist - soweit ein Cast überhaupt erforderlich ist - grundsätzlich static_cast zuständig, abgesehen von ein paar Ausnahmen, die dynamic_cast oder const_cast verlangen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2332744</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2332744</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 20 Jun 2013 10:40:06 GMT</pubDate></item><item><title><![CDATA[Reply to Methodenzeiger casten on Thu, 20 Jun 2013 10:39:58 GMT]]></title><description><![CDATA[<p>Ok, mit einem static_cast wäre es definiertes Verhalten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2332746</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2332746</guid><dc:creator><![CDATA[MichelRT]]></dc:creator><pubDate>Thu, 20 Jun 2013 10:39:58 GMT</pubDate></item><item><title><![CDATA[Reply to Methodenzeiger casten on Thu, 20 Jun 2013 10:46:56 GMT]]></title><description><![CDATA[<p>MichelRT schrieb:</p>
<blockquote>
<p>Ok, mit einem static_cast wäre es definiertes Verhalten?</p>
</blockquote>
<p>ja. Für die Konvertierung selbst ist (i.W.) nur erforderlich, dass A Basisklasse von B ist.<br />
Für die Legalität des Aufrufes über den Meberfunktionszeiger ist erforderlich, dass das Objekt (d.h. entscheidend ist hier der dynamische Typ), mit dem dieser Zeiger verwendet wird, diese Memberfunktion auch tatsächlich enthält. Beides ist gegeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2332747</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2332747</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 20 Jun 2013 10:46:56 GMT</pubDate></item><item><title><![CDATA[Reply to Methodenzeiger casten on Thu, 20 Jun 2013 10:53:59 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Für die Legalität des Aufrufes über den Meberfunktionszeiger ist erforderlich, dass das Objekt (d.h. entscheidend ist hier der dynamische Typ), mit dem dieser Zeiger verwendet wird, diese Memberfunktion auch tatsächlich enthält. Beides ist gegeben.</p>
</blockquote>
<p>Gut, genau das war auch meine Überlegung.<br />
Schön ist zwar anders ... aber wenn das restliche Progtramm sicherstellt, dass die Methoden nur mit passenden Instanzen gerufen werden, vertretbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2332750</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2332750</guid><dc:creator><![CDATA[MichelRT]]></dc:creator><pubDate>Thu, 20 Jun 2013 10:53:59 GMT</pubDate></item><item><title><![CDATA[Reply to Methodenzeiger casten on Thu, 20 Jun 2013 10:59:03 GMT]]></title><description><![CDATA[<p>Ich könnte mir vorstellen, dass bestimmte mit dem Standard inkompatible Compilererweiterungen Probleme machen können (wie die - zum Glück abschaltbaren - unterschiedlich großen Memberfunktionszeiger bei Visual C++).</p>
<pre><code class="language-cpp">struct A {};
struct B : A { virtual void f(); };

typedef void (A::*memfun)();
memfun mp = static_cast&lt;memfun&gt;(&amp;B::f);
B b;
A* p = &amp;b;
(p-&gt;*mp)();
</code></pre>
<p>könnte bei so einem ggf. Compiler schiefgehen, da A nicht polymorp ist, unterstützt der zugehörige Memberfunktionszeiger dann evtl. keine virtuellen Memberfunktionen.</p>
<p>Praktisch dürfte dieses Problem in dieser Form allerdings nicht auftreten, da As in realem Code hoffentlich polymorph sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2332752</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2332752</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 20 Jun 2013 10:59:03 GMT</pubDate></item><item><title><![CDATA[Reply to Methodenzeiger casten on Thu, 20 Jun 2013 11:23:50 GMT]]></title><description><![CDATA[<p>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2332762</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2332762</guid><dc:creator><![CDATA[MichelRT]]></dc:creator><pubDate>Thu, 20 Jun 2013 11:23:50 GMT</pubDate></item></channel></rss>