<?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 Überladene Funktionen, Warnung vom Compiler?]]></title><description><![CDATA[<p>Hallo Forum</p>
<p>Frage zu Überladenen virtueller Funktionen</p>
<p>Kurz das Problem als Beispiel.</p>
<pre><code class="language-cpp">class Base
{
public:
 virtual void serialize(ostream &amp;out);
 virtual void serialize(ostream &amp;out, bool child);
};

class Wichtig : public Base
{
public:
 virtual void serialize(ostream &amp;out);
};
</code></pre>
<p>Jetzt mahnt mich der Compiler an das die zweite Funktion in der Klasse base von der ersten Funktion in der Klasse Wichtig versteckt wird. (hidden)<br />
Compelieren lässt sich das und funktioniert auch. (Beide Funktionen über Klase Wichtig aufzurufen)</p>
<p>Jetzt die Frage:<br />
Ist das ein Fehler vom Code, eine Überflüssige Meldung vom Compier oder nur ein schlechter Still, worauf mich der compiler aufmerksam machen will.</p>
<p>Lichtlein</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/288046/virtuelle-überladene-funktionen-warnung-vom-compiler</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 04:02:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/288046.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 09 Jun 2011 13:06:55 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Virtuelle Überladene Funktionen, Warnung vom Compiler? on Thu, 09 Jun 2011 13:06:55 GMT]]></title><description><![CDATA[<p>Hallo Forum</p>
<p>Frage zu Überladenen virtueller Funktionen</p>
<p>Kurz das Problem als Beispiel.</p>
<pre><code class="language-cpp">class Base
{
public:
 virtual void serialize(ostream &amp;out);
 virtual void serialize(ostream &amp;out, bool child);
};

class Wichtig : public Base
{
public:
 virtual void serialize(ostream &amp;out);
};
</code></pre>
<p>Jetzt mahnt mich der Compiler an das die zweite Funktion in der Klasse base von der ersten Funktion in der Klasse Wichtig versteckt wird. (hidden)<br />
Compelieren lässt sich das und funktioniert auch. (Beide Funktionen über Klase Wichtig aufzurufen)</p>
<p>Jetzt die Frage:<br />
Ist das ein Fehler vom Code, eine Überflüssige Meldung vom Compier oder nur ein schlechter Still, worauf mich der compiler aufmerksam machen will.</p>
<p>Lichtlein</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2075715</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2075715</guid><dc:creator><![CDATA[Lichtlein]]></dc:creator><pubDate>Thu, 09 Jun 2011 13:06:55 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Überladene Funktionen, Warnung vom Compiler? on Thu, 09 Jun 2011 13:35:57 GMT]]></title><description><![CDATA[<p>Wenn ich nicht irgendeine Sonderklausel im Standard für virtuelle Funktionen übersehen habe, dann hat das nichts mit virtual zu tun, sondern ist das normale Verhalten für überladene Funktionen. Denn Überladung funktioniert nur im gleichen Scope und der Scope von Klassen die voneinander erben ist <strong>nicht</strong> gleich.</p>
<p>Beispiel aus dem Standard (Kapitel 13.2):</p>
<pre><code class="language-cpp">class B {
public :
 int f ( int );
};
class D : public B {
public :
 int f ( char *);
};
</code></pre>
<p>Hier wird B::f(int) von D::f(char*) verdeckt, nicht überladen.</p>
<p>Der Compiler warnt dich, weil das eventuell nicht das Verhalten ist was du wünscht und du die Funktion serialize(ostream &amp;, bool) von einem Wichtig-Objekt aus nicht mehr ohne weiteres aufrufen kannst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2075743</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2075743</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 09 Jun 2011 13:35:57 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Überladene Funktionen, Warnung vom Compiler? on Thu, 09 Jun 2011 14:06:17 GMT]]></title><description><![CDATA[<p>So ganz zufrieden bin ich mit der Antwort nicht oder verstehe nicht ganz die Logic dahinter. Werde mich wohl aber damit abfinden müssen und solche Konstrukte nicht mehr machen.</p>
<p>Danke schön<br />
Lichtlein</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2075759</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2075759</guid><dc:creator><![CDATA[Lichtlein]]></dc:creator><pubDate>Thu, 09 Jun 2011 14:06:17 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Überladene Funktionen, Warnung vom Compiler? on Thu, 09 Jun 2011 14:15:25 GMT]]></title><description><![CDATA[<p>Frag ruhig genau nach, wenn du etwas nicht verstehst.</p>
<p>Wenn du nur sagst, dass du etwas nicht verstehst, kann ich dir auch nicht weiterhelfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2075764</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2075764</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 09 Jun 2011 14:15:25 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Überladene Funktionen, Warnung vom Compiler? on Thu, 09 Jun 2011 14:21:32 GMT]]></title><description><![CDATA[<p>Lichtlein schrieb:</p>
<blockquote>
<p>Jetzt mahnt mich der Compiler an das die zweite Funktion in der Klasse base von der ersten Funktion in der Klasse Wichtig versteckt wird. (hidden)<br />
Compelieren lässt sich das und funktioniert auch. (Beide Funktionen über Klase Wichtig aufzurufen)</p>
</blockquote>
<p>Das ist ein bisschen unpräzise.<br />
Untersuchen wir einfach mal alle Möglichekeiten eines direkten Funktionsaufrufes:</p>
<pre><code class="language-cpp">Wichtig x( ... );
Base&amp; y = x;

x.serialize(cout); // ok
x.serialize(cout, true); // Fehler: diese Überladung wird verdeckt

y.serialize(cout); // ok
y.serialize(cout, true); // ok

x.Wichtig::serialize(cout, true); // ok
</code></pre>
<p>Sind virtuelle Funktionen im Spiel, werden Aufrufe typischerweise über das Interface der Basisklasse ausgeführt, damit spielt die Verdeckung dann keine Rolle.<br />
Die allgemein empfohlene Abhilfe besteht in einer entsprechenden using Deklaration:</p>
<pre><code class="language-cpp">class Wichtig : public Base
{
public:
 using Base::serialize; // damit werden alle Deklaration der aus Base geerbten serialize Funktionen in den Scope der Klasse Wichtig injiziert
 virtual void serialize(ostream &amp;out);
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2075767</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2075767</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 09 Jun 2011 14:21:32 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Überladene Funktionen, Warnung vom Compiler? on Thu, 09 Jun 2011 14:56:16 GMT]]></title><description><![CDATA[<p>Ok, bei Deinen Beispiel kann ich das noch nachvollziehen.<br />
Eine Funktion mit 1 Parameter der aber unterschiedlich ist.</p>
<p>Aber bei den Virtuellen Funktionen nicht mehr.</p>
<p>Der Compiler muss ja für jede Funktion in den Sprungtabellen einen Eintrag machen.</p>
<pre><code class="language-cpp">(vtable) fuer Klasse Base
{func0] Base::~Base()
[func1] Base::serialize(ostream &amp;Out)
[func2] Base::serialize(ostream &amp;Out, bool Child)
[func3] ....
</code></pre>
<p>Nun macht er die vtable fuer Klasse Wichtig</p>
<pre><code class="language-cpp">(vtable) fuer Wichtig
{func0] Wichtig::~Wichtig()
[func1] Wichtig::serialize(ostream &amp;Out)
[func2] Base::serialize(ostream &amp;Out, bool Child)
[func3] ....
</code></pre>
<p>Findet der Compiler im Source die Stelle</p>
<pre><code class="language-cpp">serialize(cout);
</code></pre>
<p>und dann</p>
<pre><code class="language-cpp">serialize(cout, true);
</code></pre>
<p>kann er sie zu 100% richtig zuordnen. Also bedarf es keiner Warnung.</p>
<p>Ich kann mir aber denken das ausgehend von Deinen Beispiel, wo die Warnung angebracht ist, nicht noch einen Sonderregelung/Sonderüberprüfungen für Virtuelle/Überlade/Vererbte Funktionen erdacht worden ist, sondern der Compiler einfach eine Warnung schmeißt obwohl hier immer zu 100% Richtig aufgelöst werden kann.</p>
<p>Lichtlein</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2075797</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2075797</guid><dc:creator><![CDATA[Lichtlein]]></dc:creator><pubDate>Thu, 09 Jun 2011 14:56:16 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Überladene Funktionen, Warnung vom Compiler? on Thu, 09 Jun 2011 15:08:18 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a></p>
<p>Oh danke, ich habe das jetzt selber ausprobiert.<br />
Genau wie du geschrieben hast.</p>
<p>Habe dann noch mal meine Sourcen überflogen und die Stellen gesucht wo der Compiler nur eine Warnung gebracht hatte. (Waren etwa 10) Wie es der zufall will wurde immer nur die Funktion aufgerufen die auch virtual vererbt worden war. <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 />
Und die andere Funktion wurde nur aus der base Klasse benutzt. Wurde ich dadurch auf die falsche Fährte geführt.</p>
<p>Übrigens, das mit den using ist eine gute idee. Denke nie dran das man auch funktionsnamen damit aufsetzen kann.</p>
<p>Lichtlein</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2075813</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2075813</guid><dc:creator><![CDATA[Lichtlein]]></dc:creator><pubDate>Thu, 09 Jun 2011 15:08:18 GMT</pubDate></item></channel></rss>