<?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[Zeiger auf virtuelle Memberfunktionen]]></title><description><![CDATA[<p>Hallo,</p>
<p>weiß jemand ob man Zeiger auf virtuelle Methoden erstellen und diese im Konstruktor der Basisklasse initialisieren kann, sodass der Zeiger automatisch auf die richtige &quot;überschriebene&quot; virtuelle Methode der abgeleiteten Klasse zeigt?</p>
<p>z.B.: Gegeben ist die Basisklasse A mit einer virtuellen Memberfunktion f(). Im Konstruktor dieser Klasse wird ein Zeiger auf die Funktion f() erstellt. Nun wird von dieser Klasse eine weitere Klasse B abgeleitet. In dieser wird die Funktion f() neu-definiert. Im Konstruktor der Klasse B wird der Konstruktor der Klasse A aufgerufen (a la &quot;B() : A() {}&quot; ). Zeigt der Zeiger dann auf &amp;A::f oder auf &amp;B::f? (ich glaube zwar, dass der Zeiger auf &amp;A::f zeigen wird, weil virtuelle Methoden innerhalb von Konstruktoren nicht (richtig) funktionieren, bin mir aber nicht ganz sicher)</p>
<p>mfg<br />
Alex</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/296243/zeiger-auf-virtuelle-memberfunktionen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 15 Aug 2026 01:08:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/296243.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 30 Nov 2011 15:49:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zeiger auf virtuelle Memberfunktionen on Wed, 30 Nov 2011 15:49:22 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>weiß jemand ob man Zeiger auf virtuelle Methoden erstellen und diese im Konstruktor der Basisklasse initialisieren kann, sodass der Zeiger automatisch auf die richtige &quot;überschriebene&quot; virtuelle Methode der abgeleiteten Klasse zeigt?</p>
<p>z.B.: Gegeben ist die Basisklasse A mit einer virtuellen Memberfunktion f(). Im Konstruktor dieser Klasse wird ein Zeiger auf die Funktion f() erstellt. Nun wird von dieser Klasse eine weitere Klasse B abgeleitet. In dieser wird die Funktion f() neu-definiert. Im Konstruktor der Klasse B wird der Konstruktor der Klasse A aufgerufen (a la &quot;B() : A() {}&quot; ). Zeigt der Zeiger dann auf &amp;A::f oder auf &amp;B::f? (ich glaube zwar, dass der Zeiger auf &amp;A::f zeigen wird, weil virtuelle Methoden innerhalb von Konstruktoren nicht (richtig) funktionieren, bin mir aber nicht ganz sicher)</p>
<p>mfg<br />
Alex</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2151123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2151123</guid><dc:creator><![CDATA[c0ff33.alex]]></dc:creator><pubDate>Wed, 30 Nov 2011 15:49:22 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf virtuelle Memberfunktionen on Wed, 30 Nov 2011 16:08:54 GMT]]></title><description><![CDATA[<p>Erstens: Zeiger auf memberfunktionen sind ziemlich komplex. (<a href="http://www.parashift.com/c++-faq-lite/pointers-to-members.html" rel="nofollow">http://www.parashift.com/c++-faq-lite/pointers-to-members.html</a> Da gibt es jede Menge informationen über Member Pointer)</p>
<p>Und wenn ich das richtig verstanden habe willst du sowas hier machen? :</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class A {
    public:
        A() {
            f_r=&amp;A::f;
        }
        virtual ~A() {}
        virtual void f() { cout&lt;&lt;&quot;In A&quot;&lt;&lt;endl; }
        virtual void call() {(this-&gt;*f_r)(); }
        void (A::*f_r)();
};

class B: public A {
    public:
        void call() { (this-&gt;*f_r)(); }
        void f() { cout&lt;&lt;&quot;In B&quot;&lt;&lt;endl; }
};

int main(int, char**) 
{
    A* o;
    o=new B();
    o-&gt;call();
    (o-&gt;*(o-&gt;f_r))();
    delete o;
}
</code></pre>
<p>Bei mir gibt das 2 mal &quot;In B&quot; aus.</p>
<p>EDIT: Am Ende muss natürlich noch delete o stehen, und der Destruktor von A muss virtuel sein. Geändert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2151130</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2151130</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Wed, 30 Nov 2011 16:08:54 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf virtuelle Memberfunktionen on Wed, 30 Nov 2011 16:14:03 GMT]]></title><description><![CDATA[<p>Meinst du so?</p>
<pre><code class="language-cpp">#include&lt;iostream&gt;

class Base
{
  void (Base::*mem_fun)();
public:
  Base():mem_fun(&amp;Base::virt_func) {}
  virtual void virt_func() { std::cout &lt;&lt; &quot;Base\n&quot;; }
  void call() { (this-&gt;*mem_fun)(); }
};

class Derived: public Base
{
public:
  virtual void virt_func() { std::cout &lt;&lt; &quot;Derived\n&quot;; }
};

int main()
{
  Base base;
  base.call();
  Derived derived;
  derived.call();
  Base *ptr = &amp;base;
  ptr-&gt;call();
  ptr = &amp;derived;
  ptr-&gt;call();
}
</code></pre>
<p>Das sollte funktionieren, weil der Compiler bei virtuellen Funktionen den this-Zeiger &quot;übersetzt&quot;, d.h. es die virtuellen Funktionen haben passende Adressen, damit man durch ein paar passende Additionen auf den this-Zeiger zu der passenden Funktion kommt. Ich weiß aber gerade nicht auswendig, ob das vom Standard garantiert ist oder nur bei Compilern funktioniert die virtuelle Funktionen mittels V-Table implementieren (das sind praktisch alle).</p>
<p>Die Frage ist natürlich, wozu man das braucht. Man hat hier praktisch die Funktion des V-Tables nachprogrammiert (bzw. genutzt), also genau das gemacht, was der Compiler beim Aufruf virtueller Funktionen sowieso schon tut. Oder habe ich dich falsch verstanden und du meintest das anders?</p>
<p>edit: zu spät.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2151131</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2151131</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 30 Nov 2011 16:14:03 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf virtuelle Memberfunktionen on Wed, 30 Nov 2011 16:33:34 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19375">@SeppJ</a> und <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/27772">@pyhax</a>: ja ihr habt das Richtig verstanden.</p>
<p>Ich wollte für mein Projekt ein kleines Callback-Mechanismus implementieren und es war halt wichtig für mich zu wissen, ob ich bei jeder Klasse die abgeleitete Funktion an ein Event &quot;Bind()&quot;en muss oder ob das auch mit weniger Boilerplate Code geht (und ich nur in der Basisklasse &quot;Bind()&quot;en muss).</p>
<p>Vielen Dank für die Antworten, ich bin positiv überrascht <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="🙂"
    /> .<br />
Eine Frage hätte ich noch: ihr benutzt beide eine separate Funktion zum Aufrufen von der Funktion mittels Zeiger. Ist das nur guter Stil oder steckt da irgendeine &quot;technische Nuance&quot; dahinter?</p>
<p>nochmal Dankeschön für die Antworten!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2151146</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2151146</guid><dc:creator><![CDATA[c0ff33.alex]]></dc:creator><pubDate>Wed, 30 Nov 2011 16:33:34 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf virtuelle Memberfunktionen on Wed, 30 Nov 2011 16:41:42 GMT]]></title><description><![CDATA[<p>Ich kenne mich da nicht so aus ... Finde es bloß praktischer einfach this-&gt;call() aufzurufen als (this-&gt;*f_p)(), und außerdem verhindert das das jeder zugriff auf den Funktionspointer hat (man kann den Funktionspointer dann private machen)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2151148</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2151148</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Wed, 30 Nov 2011 16:41:42 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf virtuelle Memberfunktionen on Wed, 30 Nov 2011 16:42:54 GMT]]></title><description><![CDATA[<p>ok, danke das wollte ich wissen <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/2151149</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2151149</guid><dc:creator><![CDATA[c0ff33.alex]]></dc:creator><pubDate>Wed, 30 Nov 2011 16:42:54 GMT</pubDate></item></channel></rss>