<?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[virtuelle Methode und template Klasse]]></title><description><![CDATA[<p>Hi leute ich hab ein problem, ohne das ich mein programm nicht zum laufen bekomme:<br />
Ich habe ein reflection interface programmiert, das klappt auch sehr gut, jedoch muss man bei reinen &quot;base&quot; klassen aufpassen:<br />
Ein Beispiel:</p>
<pre><code class="language-cpp">class Base
{ 
public:
    virtual void hallo() { cout &lt;&lt; &quot;not ok&quot; &lt;&lt; endl; }
};

template&lt;class RC&gt;
class ReflectionInterface 
{
public:
    void hallo() { cout &lt;&lt; &quot;ok&quot; &lt;&lt; endl; }
};

class Derived : public Base, public ReflectionInterface&lt;Derived&gt;
{
}:

int main()
{
    Base* b = new Derived();
    b-&gt;hallo(); // &quot;not ok&quot;

    cin.get();
    return 0;
}
</code></pre>
<p>Das problem ist, dass &quot;not ok&quot; rauskommt. Sollte hallo() nicht eigentlich von ReflectionInterface überschrieben werden?<br />
Da dies ja offensichtlich nicht der fall ist, wie könnte ich das ganze so hinbekommen, dass die virtuelle methode in Base von der von der template klasse überschrieben wird?</p>
<p>edit: public Base bei Derived vergessen<br />
edit2: fuuuu, eine geschweifte klammer vergessen.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/267602/virtuelle-methode-und-template-klasse</link><generator>RSS for Node</generator><lastBuildDate>Wed, 02 Sep 2026 09:36:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/267602.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 27 May 2010 08:05:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to virtuelle Methode und template Klasse on Thu, 27 May 2010 08:09:00 GMT]]></title><description><![CDATA[<p>Hi leute ich hab ein problem, ohne das ich mein programm nicht zum laufen bekomme:<br />
Ich habe ein reflection interface programmiert, das klappt auch sehr gut, jedoch muss man bei reinen &quot;base&quot; klassen aufpassen:<br />
Ein Beispiel:</p>
<pre><code class="language-cpp">class Base
{ 
public:
    virtual void hallo() { cout &lt;&lt; &quot;not ok&quot; &lt;&lt; endl; }
};

template&lt;class RC&gt;
class ReflectionInterface 
{
public:
    void hallo() { cout &lt;&lt; &quot;ok&quot; &lt;&lt; endl; }
};

class Derived : public Base, public ReflectionInterface&lt;Derived&gt;
{
}:

int main()
{
    Base* b = new Derived();
    b-&gt;hallo(); // &quot;not ok&quot;

    cin.get();
    return 0;
}
</code></pre>
<p>Das problem ist, dass &quot;not ok&quot; rauskommt. Sollte hallo() nicht eigentlich von ReflectionInterface überschrieben werden?<br />
Da dies ja offensichtlich nicht der fall ist, wie könnte ich das ganze so hinbekommen, dass die virtuelle methode in Base von der von der template klasse überschrieben wird?</p>
<p>edit: public Base bei Derived vergessen<br />
edit2: fuuuu, eine geschweifte klammer vergessen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1903053</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1903053</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Thu, 27 May 2010 08:09:00 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Methode und template Klasse on Thu, 27 May 2010 08:17:09 GMT]]></title><description><![CDATA[<p>Da sist mit sicherheit nicht der originaltext, der dein Problem verursacht.<br />
Zum Einen fehlt die schließende Klammer bei ReflectionInterface&lt;&gt;::hallo, zum Anderen ist hier der Doppelpunkt nach der Definition von ReflectionInterface durch ein Semikolon zu ersetzen, sonst kompiliert das Gnze garnicht erst.</p>
<p>Der Grund warum du dann nicht die richtige Fehlermeldung bekommst, ist folgender:<br />
ReflectionInterface erbt nicht von Base und überlädt daher nicht die virtuelle Funktion.<br />
Derived hat zwei verschiedene Funktionen Namens hallo, eine virtuelle, von base geerbt, sowie die nichtvirtuelle, von ReflectionInterface geerbt. Du könntest daher von Derived aus hallo nicht aufrufen, ohne es genauer zu qualifizieren (ein übliches Problem bei Mehrfachvererbung).</p>
<p>Wenn du allerdings ein Derived über einen Base-Pointer ansprichst wie hier, ist ganz klar was passiert: der statische Typ des Pointers ist Base, daher wird Base::hallo aufgerufen, bzw. da dies virtuell ist, eventuelle Überladungen in abgeleiteten Klassen - Derived überlädt hallo() aber nicht, und es wird Base::hallo() aufgerufen.</p>
<p>Ich vermute mal dass du die Vererbung falsch benutzt und eigentlich ReflectionInterface von Base ableiten wolltest und Derived nur vom ReflectionInterface, dann klappts auch mit dem &quot;ok&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1903061</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1903061</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 27 May 2010 08:17:09 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Methode und template Klasse on Thu, 27 May 2010 08:21:40 GMT]]></title><description><![CDATA[<p>Ich denke, Du willst das hier haben:</p>
<pre><code class="language-cpp">class Base
{
public:
    virtual void hallo() { cout &lt;&lt; &quot;not ok&quot; &lt;&lt; endl; }
};

template&lt;class RC&gt;
class ReflectionInterface : public Base
{
public:
    void hallo() { cout &lt;&lt; &quot;ok&quot; &lt;&lt; endl; }
};

class Derived : public ReflectionInterface&lt;Derived&gt;
{
};

int main()
{
    Base* b = new Derived();
    b-&gt;hallo(); // &quot;not ok&quot;
}
</code></pre>
<p>Beachte, ich habe das &quot;: public Base&quot; bei Derived entfernt und bei ReflectionInterface hingepackt.</p>
<p>Noch ein Tipp: Versuche polymorphe Klassen, die nur als Basis benutzt werden sollen, abstrakt zu machen. Statt</p>
<pre><code class="language-cpp">virtual void hallo() { cout &lt;&lt; &quot;not ok&quot; &lt;&lt; endl; }
</code></pre>
<p>hätte man schreiben können:</p>
<pre><code class="language-cpp">virtual void hallo() = 0;
</code></pre>
<p>Damit wird Base abstrakt und man kann dadurch so einige Fehlerquellen ausschließen.</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1903065</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1903065</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 27 May 2010 08:21:40 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Methode und template Klasse on Thu, 27 May 2010 08:25:36 GMT]]></title><description><![CDATA[<p>Außderdem sollte das Interface noch einen virtuellen Destruktor bekommen. Sonst knallt es spätestens beim (eigentlich notwendigen) <code>delete b</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1903070</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1903070</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Thu, 27 May 2010 08:25:36 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Methode und template Klasse on Thu, 27 May 2010 08:38:10 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24868">@krümelkacker</a>: Das geht leider nicht, da ich sonst die biblothek duplizieren müsste (bei den ohne hin schon 5.000 zeile code für die reflection von methoden, die bis zu 30 argumente brauchen, wäre das der absolute overkill).<br />
Ich glaube ich mach einfach ein void test() { ReflectionInterface&lt;Derived&gt;::test(); } bei class Derived rein, dann müsste es eigentlich klappen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1903074</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1903074</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Thu, 27 May 2010 08:38:10 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Methode und template Klasse on Thu, 27 May 2010 08:46:43 GMT]]></title><description><![CDATA[<p>aaaaaha, sehr interessant: wenn ich eine virtuelle methode habe, die eine struct zurückgibt, dann erscheint bei mir ein unaufgelöstes symbol!<br />
Kennt das problem jemand?</p>
<p>EDIT: die methode guckt soaus: virtual PyObject* Py_GetInstance() = 0;<br />
PyObject* ist ein zeiger auf eine struct.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1903075</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1903075</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Thu, 27 May 2010 08:46:43 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Methode und template Klasse on Thu, 27 May 2010 08:46:51 GMT]]></title><description><![CDATA[<p>Krauzi schrieb:</p>
<blockquote>
<p>aaaaaha, sehr interessant: wenn ich eine virtuelle methode habe, die eine struct zurückgibt, dann erscheint bei mir ein unaufgelöstes symbol!<br />
Kennt das problem jemand?</p>
</blockquote>
<p>Das hat nichts damit zu tun, ob die Methode virtuell ist oder was sie zurück gibt... der Fehler liegt woanders. Code bitte (möglichst kurz, aber compilierfähig und sollte den Fehler ergeben) <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/1903077</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1903077</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 27 May 2010 08:46:51 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Methode und template Klasse on Thu, 27 May 2010 09:19:11 GMT]]></title><description><![CDATA[<p>hm ich glaube das war blos ein bug, ich habe mal noch die bereits kompilierten dateien gelöscht, dannach hat er erfolgreich kompiliert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1903089</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1903089</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Thu, 27 May 2010 09:19:11 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Methode und template Klasse on Thu, 27 May 2010 10:30:19 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class Base
{
public:
    virtual void hallo() { cout &lt;&lt; &quot;not ok&quot; &lt;&lt; endl; }
    virtual ~Base(){};
};

template&lt;class RC&gt;
class ReflectionInterface
{
public:
    void hallo() { cout &lt;&lt; &quot;ok&quot; &lt;&lt; endl; }
    virtual ~ReflectionInterface(){};
};

class Derived : virtual public Base, virtual public ReflectionInterface&lt;Derived&gt;
{
};

typedef std::basic_string&lt;char&gt; CString;
int main()
{

    Base* b = new Derived();
    b-&gt;hallo(); // &quot;not ok&quot;
    (dynamic_cast&lt;Derived*&gt;( b))-&gt;ReflectionInterface&lt;Derived&gt;::hallo();
    delete b;
    return 0;
}
</code></pre>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1903135</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1903135</guid><dc:creator><![CDATA[Barados]]></dc:creator><pubDate>Thu, 27 May 2010 10:30:19 GMT</pubDate></item></channel></rss>