<?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 Funktionen &amp;quot;komplett&amp;quot; überladen]]></title><description><![CDATA[<p>Hi zusammen.</p>
<p>Ist es möglich eine virtuelle Funktion, welche ich in einer Basisklasse habe komplett zu überladen, d.h. auch Parameter ändern??</p>
<p>Beispiel:</p>
<pre><code>class A
{
    virtual void tuWas();
};

class B : public class A
{
    void tuWas(Objekt hiermit);
};
</code></pre>
<p>habe nämlich bisher immer nur gesehen, dass wenn man eine virtuelle Funbktion überlädt, dann mit genau dem selben funktionskopf.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/221386/virtuelle-funktionen-quot-komplett-quot-überladen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 06 Oct 2026 05:54:50 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/221386.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 28 Aug 2008 13:14:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to virtuelle Funktionen &amp;quot;komplett&amp;quot; überladen on Thu, 28 Aug 2008 13:14:34 GMT]]></title><description><![CDATA[<p>Hi zusammen.</p>
<p>Ist es möglich eine virtuelle Funktion, welche ich in einer Basisklasse habe komplett zu überladen, d.h. auch Parameter ändern??</p>
<p>Beispiel:</p>
<pre><code>class A
{
    virtual void tuWas();
};

class B : public class A
{
    void tuWas(Objekt hiermit);
};
</code></pre>
<p>habe nämlich bisher immer nur gesehen, dass wenn man eine virtuelle Funbktion überlädt, dann mit genau dem selben funktionskopf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1572971</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1572971</guid><dc:creator><![CDATA[Toudinho]]></dc:creator><pubDate>Thu, 28 Aug 2008 13:14:34 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Funktionen &amp;quot;komplett&amp;quot; überladen on Thu, 28 Aug 2008 13:19:18 GMT]]></title><description><![CDATA[<p>Toudinho schrieb:</p>
<blockquote>
<p>habe nämlich bisher immer nur gesehen, dass wenn man eine virtuelle Funbktion überlädt, dann mit genau dem selben funktionskopf.</p>
</blockquote>
<p>Du verwechselst <em>überschreiben</em> mit <em>überladen</em>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1572977</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1572977</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Thu, 28 Aug 2008 13:19:18 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Funktionen &amp;quot;komplett&amp;quot; überladen on Thu, 28 Aug 2008 13:48:53 GMT]]></title><description><![CDATA[<p>David_pb schrieb:</p>
<blockquote>
<p>Toudinho schrieb:</p>
<blockquote>
<p>habe nämlich bisher immer nur gesehen, dass wenn man eine virtuelle Funbktion überlädt, dann mit genau dem selben funktionskopf.</p>
</blockquote>
<p>Du verwechselst <em>überschreiben</em> mit <em>überladen</em>.</p>
</blockquote>
<p>Ich glaube nicht, dass er es verwechselt, sondern er hätte in diesem Fall lieber &quot;überschreiben&quot; statt &quot;überladen&quot; gehabt.</p>
<p>Aber der Standard hat das nunmal anders beschlossen.<br />
Und ich finde sogar, dass das gut ist, denn so eine &quot;Signaturerweiterung&quot; würde schon im Standardfall der Polymorphie (für den ja virtual gemacht wurde) schon nicht mehr funktionieren:</p>
<pre><code class="language-cpp">struct A {
    virtual void tuWas();
};

struct B : A {
    void tuWas(Objekttyp1 hiermit);
}; 

struct C : A {
    void tuWas(Objekttyp2 hiermit);
};

// tuWas() haben ja alle As (also auch seine &quot;Erben&quot;) gemeinsam:
void mache_was_mit_irgendeinem_A(A* a);

int main() {
   A a;
   B b;
   C c;
   mache_was_mit_irgendeinem_A(&amp;a);
   mache_was_mit_irgendeinem_A(&amp;b);
   mache_was_mit_irgendeinem_A(&amp;c);
   return 0;
}

void mache_was_mit_irgendeinem_A(A* a) {
   a-&gt;tuWas(???????); // &lt;--- was soll ich da hinschreiben ?
}
</code></pre>
<p>Gruß,</p>
<p>Simon2.</p>
<p>P.S.: Du hast da ein &quot;class&quot; mehr als nötig. In C++ ist bereits &quot;A&quot; ein Typ ... da braucht's kein &quot;class&quot; (oder &quot;struct&quot;) mehr davor. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1573014</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1573014</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 28 Aug 2008 13:48:53 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Funktionen &amp;quot;komplett&amp;quot; überladen on Thu, 28 Aug 2008 14:58:17 GMT]]></title><description><![CDATA[<p>Die Signatur einer virtuellen Funktion muss beim Überschreiben übereinstimmen, andernfalls handelt es sich um eine Überladung. Aus LSP-Sicht ist das nicht zwingend erforderlich, solange jedes Argumenttupel, dass die Funktion der Basisklasse aufrufen könnte, für den Aufruf der entsprechenden Funktion in der abgeleiteten Klasse genutzt werden könnte. Die Gründe für die Nichtunterstützung von kontravarianten Funktionsargumenten sind in C++ primär technischer Natur, zudem führte die Vielzahl impliziter Konvertierungen in C++ leicht zu Mehrdeutigkeiten (und das Forwardingproblem wird auch erst im nächsten Standard gelöst werden). Grundsätzlich ist es aber möglich, kontravariante Funktionsargumente ebenso wie allgemeinere kovariante Rückgabewerte zu unterstützen (auf die gleiche Weise), wenn wir uns davon lösen, polymorph mit virtuell gleichzusetzen. Virtuelle Funktionen sind nur ein Mechanismus, um Polymorphie zu erreichen.</p>
<pre><code class="language-cpp">struct A {
    void tuWas() { tuWas_impl(); }             // polymorph
private:
    virtual void tuWas_impl();     // ggf. = 0
};

struct B : A {
    void tuWas(Objekttyp1 hiermit=Objekttyp1()) { tuWas_impl(hiermit); } // polymorph, &quot;überschreibt&quot; tuWas in A (technisch ist es natürlich eine Überladung)
private:
    void tuWas_impl() { tuWas(); }             // überschreibt die virtuelle Funktion aus A und forwarded an B::tuWas; ist hier &quot;final&quot;
    virtual void tuWas_impl(Objekttyp1)        // kontravariant erweiterte virtuelle Funktion, wird ggf. analog in abgeleiteter Klasse überschrieben
};
usw...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1573081</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1573081</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 28 Aug 2008 14:58:17 GMT</pubDate></item></channel></rss>