<?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[Output Streamingoperator überladen ( operator&amp;lt;&amp;lt; )]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich würde gerne den operator&lt;&lt; in meinen abgeleiteten Klassen überladen.</p>
<p>Also:<br />
ich habe eine Basisklasse.<br />
Davon habe ich zwei Klassen abgeleitet: Klasse1 und Klass2.</p>
<p>Nun habe ich den Streamingoperator überladen (erstmal in der Basisklasse):</p>
<pre><code class="language-cpp">friend ostream &amp; operator&lt;&lt;(ostream&amp; output, const Student&amp; curObj) {
output&lt;&lt;endl;
return output;}
</code></pre>
<p>Ich habe nun eine STL List list&lt;Basisklasse *&gt; in denen ich Zeiger auf Klase1 und Klasse2 verwalte.</p>
<p>Mein Problem ist: Wie kann ich den operator&lt;&lt; in den abgeleiteten Klassen implementieren ?</p>
<p>eigentliche Idee:<br />
Operator&lt;&lt; in der Basisklasse überladen und anschließend in den abgeleiteten Klassen überschreiben. Geht aber nicht, weil ich hier kein virtual flag verwendet darf.<br />
Bzw. ist die Grundidee wohl schon falsche ?! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Meine Lösung ist nun, dass ich nur in der Basisklasse den operator&lt;&lt; überschreibe und dort die Ausgabe mache.<br />
Funktioniert, aber ich würde gerne wissen, wie ich das umsetze, dass ich den operator&lt;&lt; in den abgeleiteten Klassen überlade und das mit der oben genannten Liste funktioniert.</p>
<p>Hoffe mein Problem ist verständlich.</p>
<p>Vielen Dank für Eure Hilfe.</p>
<p>Gruß Manuel</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/300778/output-streamingoperator-überladen-operator-lt-lt</link><generator>RSS for Node</generator><lastBuildDate>Wed, 12 Aug 2026 15:30:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/300778.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 10 Mar 2012 15:16:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Output Streamingoperator überladen ( operator&amp;lt;&amp;lt; ) on Sat, 10 Mar 2012 15:16:02 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich würde gerne den operator&lt;&lt; in meinen abgeleiteten Klassen überladen.</p>
<p>Also:<br />
ich habe eine Basisklasse.<br />
Davon habe ich zwei Klassen abgeleitet: Klasse1 und Klass2.</p>
<p>Nun habe ich den Streamingoperator überladen (erstmal in der Basisklasse):</p>
<pre><code class="language-cpp">friend ostream &amp; operator&lt;&lt;(ostream&amp; output, const Student&amp; curObj) {
output&lt;&lt;endl;
return output;}
</code></pre>
<p>Ich habe nun eine STL List list&lt;Basisklasse *&gt; in denen ich Zeiger auf Klase1 und Klasse2 verwalte.</p>
<p>Mein Problem ist: Wie kann ich den operator&lt;&lt; in den abgeleiteten Klassen implementieren ?</p>
<p>eigentliche Idee:<br />
Operator&lt;&lt; in der Basisklasse überladen und anschließend in den abgeleiteten Klassen überschreiben. Geht aber nicht, weil ich hier kein virtual flag verwendet darf.<br />
Bzw. ist die Grundidee wohl schon falsche ?! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Meine Lösung ist nun, dass ich nur in der Basisklasse den operator&lt;&lt; überschreibe und dort die Ausgabe mache.<br />
Funktioniert, aber ich würde gerne wissen, wie ich das umsetze, dass ich den operator&lt;&lt; in den abgeleiteten Klassen überlade und das mit der oben genannten Liste funktioniert.</p>
<p>Hoffe mein Problem ist verständlich.</p>
<p>Vielen Dank für Eure Hilfe.</p>
<p>Gruß Manuel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2190456</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2190456</guid><dc:creator><![CDATA[Moinuel]]></dc:creator><pubDate>Sat, 10 Mar 2012 15:16:02 GMT</pubDate></item><item><title><![CDATA[Reply to Output Streamingoperator überladen ( operator&amp;lt;&amp;lt; ) on Sat, 10 Mar 2012 15:27:55 GMT]]></title><description><![CDATA[<p>Kosi.h:19: error: redefinition of `std::ostream&amp; operator&lt;&lt;(std::ostream&amp;, const Student&amp;)'</p>
<p>Ist die Fehlermeldung, wenn ich den Streamingoperator nur in den abgeleiteten Klassen implementiere.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2190462</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2190462</guid><dc:creator><![CDATA[Moinuel]]></dc:creator><pubDate>Sat, 10 Mar 2012 15:27:55 GMT</pubDate></item><item><title><![CDATA[Reply to Output Streamingoperator überladen ( operator&amp;lt;&amp;lt; ) on Sat, 10 Mar 2012 16:01:06 GMT]]></title><description><![CDATA[<p>Moinuel schrieb:</p>
<blockquote>
<p>Mein Problem ist: Wie kann ich den operator&lt;&lt; in den abgeleiteten Klassen implementieren ?</p>
<p>eigentliche Idee:<br />
Operator&lt;&lt; in der Basisklasse überladen und anschließend in den abgeleiteten Klassen überschreiben. Geht aber nicht, weil ich hier kein virtual flag verwendet darf.<br />
Bzw. ist die Grundidee wohl schon falsche ?! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
</blockquote>
<p>Hallo Manuel,</p>
<p>Deine Grundidee ist richtig. Der Streaming-Operator ist aber eine Funktion, überschreiben nützt hier nichts. Was Du überschreiben kannst, ist eine virtual Memberfunktion, also ruft man diese in der Streaming-Funktion auf.<br />
Im Prinzip:</p>
<pre><code class="language-cpp">class Student // Basisklasse
{
    friend std::ostream&amp; operator&lt;&lt;( std::ostream&amp; out, const Student&amp; s )
    {
         s.print( out );
         return out;
    }
protected:
    virtual void print( std::ostream&amp; out ) const =0; 
};
class Klasse1 : public Student
{
protected:
    virtual void print( std::ostream&amp; out ) const
    {
        // hier steht der Code zur Ausgabe von Klasse1 nach 'out'
    }
};
class Klasse2 .. // genauso wie Klasse1
</code></pre>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2190483</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2190483</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Sat, 10 Mar 2012 16:01:06 GMT</pubDate></item><item><title><![CDATA[Reply to Output Streamingoperator überladen ( operator&amp;lt;&amp;lt; ) on Sat, 10 Mar 2012 16:03:22 GMT]]></title><description><![CDATA[<p>rufe im operator&lt;&lt; für die basisklasse eine virtuelle funktion auf, die das verhalten von print für einen ostream implementiert, wenn du dynamisch entscheiden willst, was ausgegeben werden soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2190485</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2190485</guid><dc:creator><![CDATA[oops]]></dc:creator><pubDate>Sat, 10 Mar 2012 16:03:22 GMT</pubDate></item><item><title><![CDATA[Reply to Output Streamingoperator überladen ( operator&amp;lt;&amp;lt; ) on Sat, 10 Mar 2012 16:04:16 GMT]]></title><description><![CDATA[<p>oops, zu spät ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2190486</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2190486</guid><dc:creator><![CDATA[oops]]></dc:creator><pubDate>Sat, 10 Mar 2012 16:04:16 GMT</pubDate></item><item><title><![CDATA[Reply to Output Streamingoperator überladen ( operator&amp;lt;&amp;lt; ) on Sat, 10 Mar 2012 16:10:15 GMT]]></title><description><![CDATA[<p>Hey,<br />
danke für die schnelle Hilfe.<br />
Da lag ich ja garnicht mal so daneben.</p>
<p>Danke nochmal.</p>
<p>Gruß Manuel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2190492</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2190492</guid><dc:creator><![CDATA[Moinuel]]></dc:creator><pubDate>Sat, 10 Mar 2012 16:10:15 GMT</pubDate></item><item><title><![CDATA[Reply to Output Streamingoperator überladen ( operator&amp;lt;&amp;lt; ) on Sat, 10 Mar 2012 16:12:46 GMT]]></title><description><![CDATA[<p>Da <code>operator&lt;&lt;</code> eine freie Funktion ist, kannst du natürlich kein <code>virtual</code> verwenden.</p>
<p>Moinuel schrieb:</p>
<blockquote>
<p>Meine Lösung ist nun, dass ich nur in der Basisklasse den operator&lt;&lt; überschreibe und dort die Ausgabe mache.</p>
</blockquote>
<p>Wenn du nur für die Basisklasse operator&lt;&lt; hast, dann kannst du doch immer nur die Datenelemente der Basisklasse ausgeben. Verstehe deshalb nicht, wieso das eine Lösung sein soll?</p>
<p>Du willst doch immer die Datenelemente des Objekts ausgeben, das sich hinter <code>Basisklasse*</code> verbirgt, oder? Wieso machst du dann keine <code>virtual output</code> Funktion?</p>
<p>edit: viel zu spät.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2190493</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2190493</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 10 Mar 2012 16:12:46 GMT</pubDate></item><item><title><![CDATA[Reply to Output Streamingoperator überladen ( operator&amp;lt;&amp;lt; ) on Sat, 10 Mar 2012 16:20:58 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/7393">@Werner</a> Salomon: Wieso <code>protected</code> ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2190496</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2190496</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 10 Mar 2012 16:20:58 GMT</pubDate></item><item><title><![CDATA[Reply to Output Streamingoperator überladen ( operator&amp;lt;&amp;lt; ) on Sat, 10 Mar 2012 16:32:37 GMT]]></title><description><![CDATA[<p>Gugelmoser schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/7393">@Werner</a> Salomon: Wieso <code>protected</code> ?</p>
</blockquote>
<p>Weil man die Methode von aussen nicht direkt aufrufen koennen soll (man soll ja den &lt;&lt;-Operator verwenden), die Methode aber in den Unterklassen sichtbar sein muss, damit sie ueberladen werden kann.<br />
Und protected erfuellt genau diese Anforderungen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2190501</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2190501</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Sat, 10 Mar 2012 16:32:37 GMT</pubDate></item><item><title><![CDATA[Reply to Output Streamingoperator überladen ( operator&amp;lt;&amp;lt; ) on Sat, 10 Mar 2012 16:41:21 GMT]]></title><description><![CDATA[<p>icarus2 schrieb:</p>
<blockquote>
<p>Gugelmoser schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/7393">@Werner</a> Salomon: Wieso <code>protected</code> ?</p>
</blockquote>
<p>Weil man die Methode von aussen nicht direkt aufrufen koennen soll (man soll ja den &lt;&lt;-Operator verwenden), die Methode aber in den Unterklassen sichtbar sein muss, damit sie ueberladen werden kann.<br />
Und protected erfuellt genau diese Anforderungen.</p>
</blockquote>
<p>Ich wollte damit sagen, dass es auch mit private funktioniert. (gcc 4.6.1)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2190502</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2190502</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 10 Mar 2012 16:41:21 GMT</pubDate></item><item><title><![CDATA[Reply to Output Streamingoperator überladen ( operator&amp;lt;&amp;lt; ) on Sat, 10 Mar 2012 17:02:34 GMT]]></title><description><![CDATA[<p>Zum Überschreiben reicht private aus, protected ist nur nötig, wenn die Funktion von der abgeleiteten Klasse aus aufgerufen können werden soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2190504</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2190504</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sat, 10 Mar 2012 17:02:34 GMT</pubDate></item><item><title><![CDATA[Reply to Output Streamingoperator überladen ( operator&amp;lt;&amp;lt; ) on Sat, 10 Mar 2012 17:06:06 GMT]]></title><description><![CDATA[<p>Gugelmoser schrieb:</p>
<blockquote>
<p>Ich wollte damit sagen, dass es auch mit private funktioniert. (gcc 4.6.1)</p>
</blockquote>
<p>Stimmt. Ich wusste gar nicht mehr, dass man private Methoden ueberschreiben kann <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2190506</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2190506</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Sat, 10 Mar 2012 17:06:06 GMT</pubDate></item></channel></rss>