<?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[virtual und operator&amp;lt;&amp;lt;]]></title><description><![CDATA[<p>Hallo,<br />
ich hab mir folgendes gebastelt:</p>
<pre><code class="language-cpp">class A
{
public:
  virtual void Funci(int z) { /* Mach was */ };
  A&amp; operator&lt;&lt;(int z) { Funci(z); return *this; };
};

class B : public A
{
public:
  virtual void Funci(int z) { /* Mach was ganz anderes */ };
};

void DoIt()
{
  B* MyB = new B();
  MyB &lt;&lt; 5;
}
</code></pre>
<p>Ich dachte virtual macht es möglich, dass bei meinen &quot;MyB &lt;&lt; 5&quot; das Funci aus B aufgerufen wird. Bei mir wird aber das Funci aus A aufgerufen?!?!? Verstehe ich jetzt nicht. Liegt das am Operator oder an einem generellen Verständnisproblem von mir.</p>
<p>Danke,<br />
Stefan</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/276504/virtual-und-operator-lt-lt</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 09:06:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/276504.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 03 Nov 2010 14:45:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to virtual und operator&amp;lt;&amp;lt; on Wed, 03 Nov 2010 14:45:29 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich hab mir folgendes gebastelt:</p>
<pre><code class="language-cpp">class A
{
public:
  virtual void Funci(int z) { /* Mach was */ };
  A&amp; operator&lt;&lt;(int z) { Funci(z); return *this; };
};

class B : public A
{
public:
  virtual void Funci(int z) { /* Mach was ganz anderes */ };
};

void DoIt()
{
  B* MyB = new B();
  MyB &lt;&lt; 5;
}
</code></pre>
<p>Ich dachte virtual macht es möglich, dass bei meinen &quot;MyB &lt;&lt; 5&quot; das Funci aus B aufgerufen wird. Bei mir wird aber das Funci aus A aufgerufen?!?!? Verstehe ich jetzt nicht. Liegt das am Operator oder an einem generellen Verständnisproblem von mir.</p>
<p>Danke,<br />
Stefan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1974654</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1974654</guid><dc:creator><![CDATA[stefanjann]]></dc:creator><pubDate>Wed, 03 Nov 2010 14:45:29 GMT</pubDate></item><item><title><![CDATA[Reply to virtual und operator&amp;lt;&amp;lt; on Wed, 03 Nov 2010 14:58:08 GMT]]></title><description><![CDATA[<p>Bei mir klappt's so:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class A
{
public:
  virtual void Funci(int z) { cout&lt;&lt;&quot;A::Funci\n&quot;; };
};
A&amp; operator&lt;&lt;(A&amp; a,int z) { a.Funci(z); return a; };

class B : public A
{
public:
  virtual void Funci(int z) { cout&lt;&lt;&quot;B::Funci\n&quot;; };
};

int main()
{
  B* MyB = new B();
  (*MyB) &lt;&lt; 5;
}
</code></pre>
<p>edit:<br />
oh, auch so:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class A
{
public:
  virtual void Funci(int z) { cout&lt;&lt;&quot;A::Funci\n&quot;; };
    A&amp; operator&lt;&lt;(int z) { Funci(z); return *this; };
};

class B : public A
{
public:
  virtual void Funci(int z) { cout&lt;&lt;&quot;B::Funci\n&quot;; };
};

int main()
{
  B* MyB = new B();
  (*MyB) &lt;&lt; 5;
}
</code></pre>
<p>Was war nochmal das Problem?</p>
<p>edit2: Bei alten MS-Compilern mußte man gelegentlich this-&gt;Funci(z); aufrufen, wenn man verhindern wollte, daß der Compiler aus einer spaßigen Idee heraus das virtual ignoriert. Aber Du benutzt bestimmt keinen zehn Jahr alten Compiler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1974657</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1974657</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 03 Nov 2010 14:58:08 GMT</pubDate></item><item><title><![CDATA[Reply to virtual und operator&amp;lt;&amp;lt; on Wed, 03 Nov 2010 14:54:18 GMT]]></title><description><![CDATA[<p>Dein Beispiel sollte eigentlich gar nicht kompilieren. MyB ist ein Zeiger und so müsste es heißen</p>
<pre><code class="language-cpp">MyB-&gt;operator&lt;&lt;(5);
</code></pre>
<p>Oder durch Dereferenzierung des Zeigers:</p>
<pre><code class="language-cpp">*MyB &lt;&lt; 5;
</code></pre>
<p>Dann passiert auch <code>/* Mach was ganz anderes */</code> . Das würde aber auch ohne vitual passieren, denn Du hast ein B*;<br />
Der Witz an virtual ist</p>
<pre><code class="language-cpp">A* MyB = new B();
  *MyB &lt;&lt; 5;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1974658</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1974658</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Wed, 03 Nov 2010 14:54:18 GMT</pubDate></item><item><title><![CDATA[Reply to virtual und operator&amp;lt;&amp;lt; on Wed, 03 Nov 2010 15:06:17 GMT]]></title><description><![CDATA[<p>brotbernd schrieb:</p>
<blockquote>
<p>Dein Beispiel sollte eigentlich gar nicht kompilieren. MyB ist ein Zeiger und so müsste es heißen</p>
<pre><code class="language-cpp">MyB-&gt;operator&lt;&lt;(5);
</code></pre>
<p>Oder durch Dereferenzierung des Zeigers:</p>
<pre><code class="language-cpp">*MyB &lt;&lt; 5;
</code></pre>
</blockquote>
<p>Japp, den Stern hab ich beim Beispielschreiben vergessen. *forgiveme*</p>
<p>brotbernd schrieb:</p>
<blockquote>
<p>Dann passiert auch <code>/* Mach was ganz anderes */</code> . Das würde aber auch ohne vitual passieren, denn Du hast ein B*;<br />
Der Witz an virtual ist</p>
<pre><code class="language-cpp">A* MyB = new B();
  *MyB &lt;&lt; 5;
</code></pre>
</blockquote>
<p>Ähm, nein, deswegen schreib ich ja. Ich habs gerade mit dem Debugger 5-6 mal ausprobiert. Ich lande dabei immer in Funci von A. Ich hab die Typen überprüft und die Zeiger geprüft.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1974667</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1974667</guid><dc:creator><![CDATA[stefanjann]]></dc:creator><pubDate>Wed, 03 Nov 2010 15:06:17 GMT</pubDate></item><item><title><![CDATA[Reply to virtual und operator&amp;lt;&amp;lt; on Wed, 03 Nov 2010 15:09:24 GMT]]></title><description><![CDATA[<p>Dann kopier mal dein ganzes lauffähiges Beispiel hierein. Mal sehen, was du noch alles vergessen hast abzuschreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1974669</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1974669</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Wed, 03 Nov 2010 15:09:24 GMT</pubDate></item><item><title><![CDATA[Reply to virtual und operator&amp;lt;&amp;lt; on Wed, 03 Nov 2010 15:11:12 GMT]]></title><description><![CDATA[<p>stefanjann schrieb:</p>
<blockquote>
<p>Ähm, nein, deswegen schreib ich ja. Ich habs gerade mit dem Debugger 5-6 mal ausprobiert. Ich lande dabei immer in Funci von A. Ich hab die Typen überprüft und die Zeiger geprüft.</p>
</blockquote>
<p>Welchen Compiler benutzt Du?<br />
Falls MSVC:<br />
Leg mal ein neues Projekt an und paste den Code dort rein. Ist dann dort das Verhalten immernoch befremdlich?<br />
Anderenfalls:<br />
Poste nochmal ein vollständiges Programm, das auch andere ohne Debugger nachvollziehen können, so mit cout wie bei mir, das bei Dir komische Ausgabe macht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1974670</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1974670</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 03 Nov 2010 15:11:12 GMT</pubDate></item><item><title><![CDATA[Reply to virtual und operator&amp;lt;&amp;lt; on Wed, 03 Nov 2010 15:22:11 GMT]]></title><description><![CDATA[<p>Ich habe Visual Stuio 2008 Pro.<br />
Hab jetzt meinen Debugger mal ganz genau unter die Lupe genommen. Das vollständige Listening hatt bereits knapp 200kb, das wäre wohl nicht gut hier zu posten.</p>
<p>Ich hab aber bei mir gerade etwas anderes im Debugger gesehen:</p>
<pre><code>MyB | 0x...
-&gt; A | ...
--&gt; __vfptr | const A::vftable
</code></pre>
<p>Das heisst ja wohl, dass ich beim Erzeugen der Klasse bereits die falsche virtuelle Funktionstabelle habe. Also ist mein oben genanntes Problem eigentlich keins und würde so funktionieren, wenn die richtige Tablle verwendet werden würde.</p>
<p>Ich erzeuge das Objekt durch:</p>
<pre><code class="language-cpp">// stark gekürzter Code...
A* temp = new B(); // Steht irgendwo in einer Funktion zur Objektverwaltung...
B* MyB = static_cast&lt;B*&gt;(temp); // Ist quasi der Rückgabewert....
</code></pre>
<p>Und da wirfts ihn. Habs auch schon mit dynamic_cast probiert, gleiches Problem. Wenn ich direkt mit new B() arbeite hab ich auch die richtige virtuelle Funktionstabelle-Tabelle.</p>
<p>Somit Entschuldigung für den nicht falschen Fehler und danke fürs mitdenken und euere Zeit.</p>
<p>Stefan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1974674</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1974674</guid><dc:creator><![CDATA[stefanjann]]></dc:creator><pubDate>Wed, 03 Nov 2010 15:22:11 GMT</pubDate></item><item><title><![CDATA[Reply to virtual und operator&amp;lt;&amp;lt; on Wed, 03 Nov 2010 15:25:43 GMT]]></title><description><![CDATA[<p>Aber...</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class A
{
public:
    virtual void Funci(int z)
    {
        cout&lt;&lt;&quot;A::Funci\n&quot;;
    };
    A&amp; operator&lt;&lt;(int z)
    {
        Funci(z);
        return *this;
    };
};

class B : public A
{
public:
    virtual void Funci(int z)
    {
        cout&lt;&lt;&quot;B::Funci\n&quot;;
    };
};

int main()
{
    A* temp = new B(); // Steht irgendwo in einer Funktion zur Objektverwaltung...
    B* MyB = static_cast&lt;B*&gt;(temp); // Ist quasi der Rückgabewert....
    *MyB &lt;&lt; 5;
}
</code></pre>
<p>gibt auch B::Funci aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1974675</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1974675</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 03 Nov 2010 15:25:43 GMT</pubDate></item><item><title><![CDATA[Reply to virtual und operator&amp;lt;&amp;lt; on Wed, 03 Nov 2010 15:47:09 GMT]]></title><description><![CDATA[<p>Stimmt,<br />
daher hab ich meinen Fehler wohl wo gaaaaaz anders. Ich suche noch!</p>
<p>Danke trotzdem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1974687</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1974687</guid><dc:creator><![CDATA[stefanjann]]></dc:creator><pubDate>Wed, 03 Nov 2010 15:47:09 GMT</pubDate></item><item><title><![CDATA[Reply to virtual und operator&amp;lt;&amp;lt; on Wed, 03 Nov 2010 15:47:43 GMT]]></title><description><![CDATA[<p>stefanjann schrieb:</p>
<blockquote>
<p>// stark gekürzter Code...</p>
</blockquote>
<p>Object-slicing mit weggekürzt? Also sowas:</p>
<pre><code class="language-cpp">int main()
{
    A* temp = new B;
    machWas(*temp);
}
void machWas(A arg)
{
    B* MyB = static_cast&lt;B*&gt;(&amp;arg);
    *MyB &lt;&lt; 5;
}
</code></pre>
<p>gibt A::Funci aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1974688</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1974688</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Wed, 03 Nov 2010 15:47:43 GMT</pubDate></item><item><title><![CDATA[Reply to virtual und operator&amp;lt;&amp;lt; on Wed, 03 Nov 2010 15:53:16 GMT]]></title><description><![CDATA[<p>Jockelx schrieb:</p>
<blockquote>
<p>Object-slicing mit weggekürzt? Also sowas:</p>
<pre><code class="language-cpp">int main()
{
    A* temp = new B;
    machWas(*temp);
}
void machWas(A arg)
{
    B* MyB = static_cast&lt;B*&gt;(&amp;arg);
    *MyB &lt;&lt; 5;
}
</code></pre>
<p>gibt A::Funci aus.</p>
</blockquote>
<p>Das sieht von der Form her genau so aus, was ich mache. Ich sammel meine Objekte in einer Map mit &lt;unsigned int, A*&gt;. Und zurück geben tu ich es über einen cast.<br />
Was ist das mit den Object-slicing?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1974692</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1974692</guid><dc:creator><![CDATA[stefanjann]]></dc:creator><pubDate>Wed, 03 Nov 2010 15:53:16 GMT</pubDate></item><item><title><![CDATA[Reply to virtual und operator&amp;lt;&amp;lt; on Wed, 03 Nov 2010 16:01:35 GMT]]></title><description><![CDATA[<p>Dadurch, dass die Parameterübergabe by value ist, wird ein neues Objekt erstellt, das den dynamischen Typ A hat (es wird also nicht das gesamte Objekt kopiert -&gt; Slicing). Also wird die Funktion von A aufgerufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1974698</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1974698</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Wed, 03 Nov 2010 16:01:35 GMT</pubDate></item><item><title><![CDATA[Reply to virtual und operator&amp;lt;&amp;lt; on Wed, 03 Nov 2010 16:03:59 GMT]]></title><description><![CDATA[<p>stefanjann schrieb:</p>
<blockquote>
<p>Was ist das mit den Object-slicing?</p>
</blockquote>
<p><a href="http://lmgtfy.com/?q=object+slicing+c%2B%2B" rel="nofollow">http://lmgtfy.com/?q=object+slicing+c%2B%2B</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1974699</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1974699</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 03 Nov 2010 16:03:59 GMT</pubDate></item><item><title><![CDATA[Reply to virtual und operator&amp;lt;&amp;lt; on Wed, 03 Nov 2010 16:09:31 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>stefanjann schrieb:</p>
<blockquote>
<p>Was ist das mit den Object-slicing?</p>
</blockquote>
<p><a href="http://lmgtfy.com/?q=object+slicing+c%2B%2B" rel="nofollow">http://lmgtfy.com/?q=object+slicing+c%2B%2B</a></p>
</blockquote>
<p>Danke und Entschuldigung, dass ich im Eifer des Gefechtes einfach mal ne Frage zu einem (für mich) neuem Bereich gestellt habe.</p>
<p>Ob mans glaubt oder nicht, gleich nach dem Absenden meines Beitrages hab ich sogar eine Suchmaschine befragt und mein Handbuch gezogen, noch bevor ich darauf hingewiesen wurde, dass es Google gibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1974704</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1974704</guid><dc:creator><![CDATA[stefanjann]]></dc:creator><pubDate>Wed, 03 Nov 2010 16:09:31 GMT</pubDate></item></channel></rss>