<?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[Redefinition virtueller Methode mit anderer Signatur oder anderem Ergebnistyp in abgeleiteter Klasse]]></title><description><![CDATA[<p>Hey!</p>
<p>In meinem Buch steht:<br />
&quot;Wird eine virtuelle Methode in der abgeleiteten Klasse mit einer anderen Signatur oder einem anderen Ergebnistyp redefiniert, so wird lediglich eine neue Methode mit gleichem Namen eingeführt. Diese ist nicht virtuell!&quot;</p>
<p>&quot;In diesem Fall ist die virtuelle Methode der Basisklasse in der abgeleiteten Klasse verdeckt. Das heißt, für ein Objekt der abgeleiteten Klasse ist nur die nicht virtuelle Version der Methode aufrufbar.&quot;</p>
<p>Den letzten Satz hab ich nicht wirklich verstanden und daher gleich ausprobiert:</p>
<pre><code class="language-cpp">class Base
{
public:
	virtual void func()
	{
		std::cout &lt;&lt; &quot;Base func&quot; &lt;&lt; std::endl;
	}
};

class Derived : public Base
{
public:
	int func()
	{
		std::cout &lt;&lt; &quot;Derived func&quot; &lt;&lt; std::endl;
		return 0;
	}
};
</code></pre>
<p>So ist das doch gemeint? Jedoch wird garnicht erst kompiliert:</p>
<pre><code>'Derived::func': overriding virtual function return type differs and is not covariant from 'Base::func'
</code></pre>
<p>Ist soetwas überhaupt legal? Wenn es nur an meinem Compiler liegt, wie wäre der letzte Satz zu verstehen?</p>
<p>Danke!<br />
MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/200296/redefinition-virtueller-methode-mit-anderer-signatur-oder-anderem-ergebnistyp-in-abgeleiteter-klasse</link><generator>RSS for Node</generator><lastBuildDate>Sun, 04 Oct 2026 18:50:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/200296.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 13 Dec 2007 08:11:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Redefinition virtueller Methode mit anderer Signatur oder anderem Ergebnistyp in abgeleiteter Klasse on Thu, 13 Dec 2007 08:11:51 GMT]]></title><description><![CDATA[<p>Hey!</p>
<p>In meinem Buch steht:<br />
&quot;Wird eine virtuelle Methode in der abgeleiteten Klasse mit einer anderen Signatur oder einem anderen Ergebnistyp redefiniert, so wird lediglich eine neue Methode mit gleichem Namen eingeführt. Diese ist nicht virtuell!&quot;</p>
<p>&quot;In diesem Fall ist die virtuelle Methode der Basisklasse in der abgeleiteten Klasse verdeckt. Das heißt, für ein Objekt der abgeleiteten Klasse ist nur die nicht virtuelle Version der Methode aufrufbar.&quot;</p>
<p>Den letzten Satz hab ich nicht wirklich verstanden und daher gleich ausprobiert:</p>
<pre><code class="language-cpp">class Base
{
public:
	virtual void func()
	{
		std::cout &lt;&lt; &quot;Base func&quot; &lt;&lt; std::endl;
	}
};

class Derived : public Base
{
public:
	int func()
	{
		std::cout &lt;&lt; &quot;Derived func&quot; &lt;&lt; std::endl;
		return 0;
	}
};
</code></pre>
<p>So ist das doch gemeint? Jedoch wird garnicht erst kompiliert:</p>
<pre><code>'Derived::func': overriding virtual function return type differs and is not covariant from 'Base::func'
</code></pre>
<p>Ist soetwas überhaupt legal? Wenn es nur an meinem Compiler liegt, wie wäre der letzte Satz zu verstehen?</p>
<p>Danke!<br />
MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419778</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419778</guid><dc:creator><![CDATA[ceplusplus@loggedoff]]></dc:creator><pubDate>Thu, 13 Dec 2007 08:11:51 GMT</pubDate></item><item><title><![CDATA[Reply to Redefinition virtueller Methode mit anderer Signatur oder anderem Ergebnistyp in abgeleiteter Klasse on Thu, 13 Dec 2007 08:30:07 GMT]]></title><description><![CDATA[<p>Du kannst eine virtuelle Funktion entweder mit identischer Signatur redefinieren oder mit einer völlig neuen Parameterliste überdecken - der Rückgabetyp ist zwar wichtig, zählt allerdings nicht zur Signatur. Bei deinem Beispiel hast du die selbe Signatur (darum will der Compiler die Funktion redefinieren), aber verschiedene - nicht kompatible - Rückgabetypen.</p>
<p>Mal ein funktionierendes Beispiel:</p>
<pre><code class="language-cpp">class base
{
public:
  virtual void func(int i)
  {
    cout&lt;&lt;&quot;base::func(&quot;&lt;&lt;i&lt;&lt;&quot;)&quot;&lt;&lt;endl;
  }
};

class derived : public base
{
public:
  virtual void func(long i)
  {
    cout&lt;&lt;&quot;derived::func(&quot;&lt;&lt;i&lt;&lt;&quot;)&quot;&lt;&lt;endl;
  }
};

int main()
{
  base* b = new derived;
  b-&gt;func(4711);//na, was für eine Ausgabe erwartest du hier? und was kommt tatsächlich?
  delete b;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1419786</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419786</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 13 Dec 2007 08:30:07 GMT</pubDate></item><item><title><![CDATA[Reply to Redefinition virtueller Methode mit anderer Signatur oder anderem Ergebnistyp in abgeleiteter Klasse on Thu, 13 Dec 2007 09:30:18 GMT]]></title><description><![CDATA[<p>Also in der abgeleiteten Klasse bleibt die Methode nur virtuell, wenn Signatur und Rückgabetyp gleich sind?</p>
<p>Weiters darf sich der Rückgabetyp nur unterscheiden, wenn es die Signatur auch tut?</p>
<p>Weil im Buch steht, die Methode kann mit anderer Signatur ODER Rückgabetyp redefiniert werden... Dass sie dann nicht mehr virtuell ist, ist klar, aber von einem Compilerfehler ist nicht die Rede.</p>
<p>Und im letzten Absatz stimmt auch nicht, dass für das Objekt der abgeleiteten Klasse nur die nicht virtuelle Methode aufrufbar ist (Sondern bei einem Aufruf mit einem Basisklassenzeiger?!).</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419811</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419811</guid><dc:creator><![CDATA[ceplusplus@loggedoff]]></dc:creator><pubDate>Thu, 13 Dec 2007 09:30:18 GMT</pubDate></item><item><title><![CDATA[Reply to Redefinition virtueller Methode mit anderer Signatur oder anderem Ergebnistyp in abgeleiteter Klasse on Thu, 13 Dec 2007 09:37:12 GMT]]></title><description><![CDATA[<p>ceplusplus@loggedoff schrieb:</p>
<blockquote>
<p>Also in der abgeleiteten Klasse bleibt die Methode nur virtuell, wenn Signatur und Rückgabetyp gleich sind?</p>
</blockquote>
<p>Die Methode bleibt in jedem Fall virtuell - die unpassende Methode der abgeleiteten Klasse überdeckt allerdings die virtuelle Methode (und ist im Ernstfall nicht virtuell)</p>
<blockquote>
<p>Weiters darf sich der Rückgabetyp nur unterscheiden, wenn es die Signatur auch tut?</p>
</blockquote>
<p>Ja - das ist wie bei überladenen Funktionen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
(OK, es gibt noch die Möglichkeit, den Rückgabetyp &quot;kovariant&quot; zu ändern, aber das ist eine andere Geschichte)</p>
<blockquote>
<p>Weil im Buch steht, die Methode kann mit anderer Signatur ODER Rückgabetyp redefiniert werden... Dass sie dann nicht mehr virtuell ist, ist klar, aber von einem Compilerfehler ist nicht die Rede.</p>
</blockquote>
<p>Da ist dein Buch vermutlich etwas ungenau - oder du hast nicht richtig zwischen den Zeilen gelesen.</p>
<blockquote>
<p>Und im letzten Absatz stimmt auch nicht, dass für das Objekt der abgeleiteten Klasse nur die nicht virtuelle Methode aufrufbar ist (Sondern bei einem Aufruf mit einem Basisklassenzeiger?!).</p>
</blockquote>
<p>Welche Methoden verfügbar sind, hängt vom statischen Typ ab (darum wird bei meinem obigen Beispiel auch die int-Methode verwendet), welche Methode tatsächlich genutzt wird, vom dynamischen Typ und ihrer &quot;Virtualität&quot; (im Beispiel ist base::func(int) virtuell, wurde aber von dereived NICHT redefiniert).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419818</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419818</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 13 Dec 2007 09:37:12 GMT</pubDate></item><item><title><![CDATA[Reply to Redefinition virtueller Methode mit anderer Signatur oder anderem Ergebnistyp in abgeleiteter Klasse on Thu, 13 Dec 2007 09:42:49 GMT]]></title><description><![CDATA[<p>Hi ceplusplus@loggedoff,</p>
<p>ich denke, Du hast die Fehlermeldung missverstanden: Der Compiler will Dir mitteilen, dass er vermutet, dass Du einen Fehler gemacht hast.<br />
Aller Wahrscheinlichkeit nach handelt es sich hier auch nur um eine Warnung, die nicht zum Abbruch des Compiles führt ...</p>
<p>Wie CStoll schon sagte: Du hast mit dem falschen Beispiel angefangen (weil Du nicht wusstest, das der Returnvalue nicht zur Signatur gehört)... und bist deswegen auf ein anderes Thema gekommen.</p>
<p>Fang doch nochmal von Vorne an mit:</p>
<pre><code class="language-cpp">struct Base {
    virtual void func() {
        std::cout &lt;&lt; &quot;Base func&quot; &lt;&lt; std::endl;
    }
};

struct Derived : Base {
    void func(int i)    {
        std::cout &lt;&lt; &quot;Derived func &quot; &lt;&lt; i &lt;&lt; std::endl;
    }
};
</code></pre>
<p>Wenn Du damit Erfahrungen zum Thema &quot;overwriting vs. overloading&quot; gemacht hast, kannst Du mit &quot;overloading mit unterschiedlichen Returnvalues&quot; experimentieren.... z.B. mit</p>
<pre><code class="language-cpp">void f();
int f();
void f(int);
</code></pre>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419822</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419822</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 13 Dec 2007 09:42:49 GMT</pubDate></item><item><title><![CDATA[Reply to Redefinition virtueller Methode mit anderer Signatur oder anderem Ergebnistyp in abgeleiteter Klasse on Thu, 13 Dec 2007 09:43:03 GMT]]></title><description><![CDATA[<p>ceplusplus@loggedoff schrieb:</p>
<blockquote>
<p>Also in der abgeleiteten Klasse bleibt die Methode nur virtuell, wenn Signatur und Rückgabetyp gleich sind?</p>
</blockquote>
<p>die signatur muss dieselbe sein, sonst wäre es nicht dieselbe funktion. der rückgabetyp muss der gleiche oder ein kovarianter sein. (wenn die basisklasse einen zeiger auf X zurückgibt, darf die funktion in der abgeleiteten klasse einen zeiger auf Y zurückgeben, falls Y von X abgeleitet ist)</p>
<blockquote>
<p>Weiters darf sich der Rückgabetyp nur unterscheiden, wenn es die Signatur auch tut?</p>
</blockquote>
<p>wenn sich die signatur unterscheidet, hast du eine andere funktion. deren rückgabetyp ist natürlich unabhängig von dem anderer funktionen.</p>
<p>lesetipp aus humesikkins C++ faq: <a href="http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&amp;faq=oho#Answ" rel="nofollow">überladen, überdecken, überschreiben</a></p>
<p>problematisch ist dabei vor allem, wenn du in der basisklasse mehrere funktionen überlädst und in der abgeleiteten klasse nur eine neu definierst, dann werden dort die anderen nämlich verdeckt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419823</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419823</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Thu, 13 Dec 2007 09:43:03 GMT</pubDate></item><item><title><![CDATA[Reply to Redefinition virtueller Methode mit anderer Signatur oder anderem Ergebnistyp in abgeleiteter Klasse on Thu, 13 Dec 2007 09:45:34 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>... &quot;overwriting vs. overloading&quot; ...</p>
</blockquote>
<p>over<em>riding</em><br />
außerdem geht es dem OP mehr um &quot;function hiding&quot; <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419825</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419825</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Thu, 13 Dec 2007 09:45:34 GMT</pubDate></item><item><title><![CDATA[Reply to Redefinition virtueller Methode mit anderer Signatur oder anderem Ergebnistyp in abgeleiteter Klasse on Thu, 13 Dec 2007 11:24:01 GMT]]></title><description><![CDATA[<p>Danke an alle.<br />
Nun scheint mir alles verständlich.</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419869</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419869</guid><dc:creator><![CDATA[ceplusplus@loggedoff]]></dc:creator><pubDate>Thu, 13 Dec 2007 11:24:01 GMT</pubDate></item><item><title><![CDATA[Reply to Redefinition virtueller Methode mit anderer Signatur oder anderem Ergebnistyp in abgeleiteter Klasse on Thu, 13 Dec 2007 12:09:38 GMT]]></title><description><![CDATA[<p>queer_boy schrieb:</p>
<blockquote>
<p>Simon2 schrieb:</p>
<blockquote>
<p>... &quot;overwriting vs. overloading&quot; ...</p>
</blockquote>
<p>over<em>riding</em><br />
außerdem geht es dem OP mehr um &quot;function hiding&quot; <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /><br />
Ach ja, der Klassiker<br />
English (&quot;overriding&quot;) -&gt; Deutsch (&quot;überschreiben&quot;) -&gt; Englisch(&quot;overwriting&quot;) .. passiert mir immer wieder.<br />
Hier war mir auch nicht ganz klar, ob er &quot;-hiding&quot; oder &quot;-riding&quot; ausprobieren wollte (spielt ja beides mit rein), weswegen mir das &quot;-writing&quot; unreflektiert passend vorkam.</p>
<p>Sorry .... und danke für die Korrektur,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419902</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419902</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 13 Dec 2007 12:09:38 GMT</pubDate></item><item><title><![CDATA[Reply to Redefinition virtueller Methode mit anderer Signatur oder anderem Ergebnistyp in abgeleiteter Klasse on Thu, 13 Dec 2007 12:40:45 GMT]]></title><description><![CDATA[<p>Ach, eins würd ich noch gern wissen:</p>
<p>Warum &quot;Never redefine an inherited nonvirtual function&quot; ?</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419925</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419925</guid><dc:creator><![CDATA[ceplusplus@loggedoff]]></dc:creator><pubDate>Thu, 13 Dec 2007 12:40:45 GMT</pubDate></item><item><title><![CDATA[Reply to Redefinition virtueller Methode mit anderer Signatur oder anderem Ergebnistyp in abgeleiteter Klasse on Thu, 13 Dec 2007 12:50:07 GMT]]></title><description><![CDATA[<p>ceplusplus@loggedoff schrieb:</p>
<blockquote>
<p>Warum &quot;Never redefine an inherited nonvirtual function&quot; ?</p>
</blockquote>
<p>Weil es da vom statischen Typ der verwendeten Variablen abhängt, welche Version der Methode letzlich aufgerufen wird:</p>
<pre><code class="language-cpp">class base
{
public:
  void func1()
  { cout&lt;&lt;&quot;base::func1()&quot;&lt;&lt;endl; }
  virtual void func2()
  { cout&lt;&lt;&quot;base::func2()&quot;&lt;&lt;endl; }
};

class derived : public base
{
public:
  void func1()
  { cout&lt;&lt;&quot;derived::func1()&quot;&lt;&lt;endl; }
  void func2()//implizit virtual
  { cout&lt;&lt;&quot;derived::func2()&quot;&lt;&lt;endl; }
};

int main()
{
  derived obj;
  base&amp; ref = obj;//Polymorphie funktioniert auch ohne Zeiger :D

  obj.func1();
  obj.func2();

  ref.func1();
  ref.func2();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1419932</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419932</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 13 Dec 2007 12:50:07 GMT</pubDate></item><item><title><![CDATA[Reply to Redefinition virtueller Methode mit anderer Signatur oder anderem Ergebnistyp in abgeleiteter Klasse on Thu, 13 Dec 2007 12:55:05 GMT]]></title><description><![CDATA[<p>ceplusplus@loggedoff schrieb:</p>
<blockquote>
<p>...Warum &quot;Never redefine an inherited nonvirtual function&quot;...</p>
</blockquote>
<p>Weil abgeleitete Klassen häufig über Zeiger auf die Basisklasse verwaltet werden, und du mit Sicherheit nicht ein unterschiedliches Verhalten willst, je nach dem ob auf das Element direkt oder ob indirekt über den Zeiger der Basisklasse zugegriffen wird.</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419934</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419934</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 13 Dec 2007 12:55:05 GMT</pubDate></item><item><title><![CDATA[Reply to Redefinition virtueller Methode mit anderer Signatur oder anderem Ergebnistyp in abgeleiteter Klasse on Thu, 13 Dec 2007 13:09:08 GMT]]></title><description><![CDATA[<p>Mhm ok aber &quot;Never ...&quot; find ich etwas übertrieben.</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419939</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419939</guid><dc:creator><![CDATA[ceplusplus@loggedoff]]></dc:creator><pubDate>Thu, 13 Dec 2007 13:09:08 GMT</pubDate></item><item><title><![CDATA[Reply to Redefinition virtueller Methode mit anderer Signatur oder anderem Ergebnistyp in abgeleiteter Klasse on Thu, 13 Dec 2007 13:24:29 GMT]]></title><description><![CDATA[<p>ceplusplus@loggedoff schrieb:</p>
<blockquote>
<p>Mhm ok aber &quot;Never ...&quot; find ich etwas übertrieben.</p>
</blockquote>
<p>Es hei-t ja auch &quot;<em>Never</em> change a running system&quot; <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
oder anders ausgedrückt: es ist keine gute Idee, eine nicht-virtuelle Methode zu überschreiben - C++ verbietet es aber nicht.</p>
<p>Und Ratschläge der Form &quot;Never do xyz&quot; solltest du nicht als &quot;mach das auf gar keinen Fall, oder du schmorst in der Hölle&quot; interpretieren, sondern als &quot;bevor du das machst, überleg dir genau, was dabei rauskommt - und welche Alternativen du hättest&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419944</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419944</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 13 Dec 2007 13:24:29 GMT</pubDate></item></channel></rss>