<?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 Methode]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich habe eine kurze Verständnisfrage zu Virtuellen Methoden einer Klasse.</p>
<p>Also ich habe eine Basisklasse (z.B Vogel) und mehrere Unterklassen (verschiedene Vögel), die von dieser Basisklasse erben. Doch meine Vögel singen alle verschieden, daher habe ich in jeder dieser Unterklassen eine Methode (Sing()), und zwar kommt diese in allen dieser Vögel vor.</p>
<p>Nun stellt sich mir die Frage, soll ich die Methode Sing() als virtuell deklarieren in der Basisklasse?</p>
<p>Was bringt das überhaupt?</p>
<p>Dankeschön!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/258146/virtuelle-methode</link><generator>RSS for Node</generator><lastBuildDate>Wed, 09 Sep 2026 11:32:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/258146.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 07 Jan 2010 07:44:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Virtuelle Methode on Thu, 07 Jan 2010 07:44:00 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich habe eine kurze Verständnisfrage zu Virtuellen Methoden einer Klasse.</p>
<p>Also ich habe eine Basisklasse (z.B Vogel) und mehrere Unterklassen (verschiedene Vögel), die von dieser Basisklasse erben. Doch meine Vögel singen alle verschieden, daher habe ich in jeder dieser Unterklassen eine Methode (Sing()), und zwar kommt diese in allen dieser Vögel vor.</p>
<p>Nun stellt sich mir die Frage, soll ich die Methode Sing() als virtuell deklarieren in der Basisklasse?</p>
<p>Was bringt das überhaupt?</p>
<p>Dankeschön!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1834112</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1834112</guid><dc:creator><![CDATA[Samyboy]]></dc:creator><pubDate>Thu, 07 Jan 2010 07:44:00 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Methode on Thu, 07 Jan 2010 07:56:43 GMT]]></title><description><![CDATA[<p>Samyboy schrieb:</p>
<blockquote>
<p>Nun stellt sich mir die Frage, soll ich die Methode Sing() als virtuell deklarieren in der Basisklasse?</p>
</blockquote>
<p>Ja, solltest du.</p>
<p>Samyboy schrieb:</p>
<blockquote>
<p>Was bringt das überhaupt?</p>
</blockquote>
<p>Nehmen wir an, du hast einen Container voller verschiedener Vögel und lässt sie alle singen:</p>
<pre><code class="language-cpp">class Vogel
{
public:
  /*virtual*/ void Sing() { std::cout &lt;&lt; &quot;Piep!\n&quot;}
};

//hier diverse Ableitungen die verschieden singen...

int main()
{
  std::vector&lt;Vogel*&gt; voliere;
  voliere.push_back( new Papagei() );
  //usw...

  for (std::vector&lt;Vogel*&gt;::iterator vit = voliere.begin(), end=voliere.end(); vit != end; ++vit)
  {
    (*vit)-&gt;Sing();
  }
}
</code></pre>
<p>Wenn du hier das virtual weglässt, macht der Compiler zur Compilezeit daraus Nmal &quot;Piep!&quot;, ansonsten wird zur Laufzeit ermittelt welche Sing()-Methode die richtige ist (d.h. von welchem Typ der Vogel tatsächlich ist) und du erhälst &quot;Zwitscher!&quot;, &quot;Tirili!&quot;, &quot;Kuckuck!&quot; usw <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="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1834116</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1834116</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 07 Jan 2010 07:56:43 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Methode on Thu, 07 Jan 2010 08:03:38 GMT]]></title><description><![CDATA[<p>Dankeschön für die tolle Erläuterung!</p>
<p>Hat mir echt weitergeholfen <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/1834117</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1834117</guid><dc:creator><![CDATA[Samyboy]]></dc:creator><pubDate>Thu, 07 Jan 2010 08:03:38 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Methode on Thu, 07 Jan 2010 08:51:24 GMT]]></title><description><![CDATA[<p>Wobei &quot;Vogel&quot; ja immer so ein schönes Beispiel ist. Nicht jeder Vogel kann singen, die Basisklassenmethode gibt's aber trotzdem. <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="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1834130</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1834130</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Thu, 07 Jan 2010 08:51:24 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Methode on Thu, 07 Jan 2010 09:16:42 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Nehmen wir an, du hast einen Container voller verschiedener Vögel und lässt sie alle singen:</p>
</blockquote>
<p>Tierquälerei!!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1834138</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1834138</guid><dc:creator><![CDATA[GreenCoder]]></dc:creator><pubDate>Thu, 07 Jan 2010 09:16:42 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Methode on Thu, 07 Jan 2010 09:25:34 GMT]]></title><description><![CDATA[<p>Ad aCTa schrieb:</p>
<blockquote>
<p>Wobei &quot;Vogel&quot; ja immer so ein schönes Beispiel ist. Nicht jeder Vogel kann singen, die Basisklassenmethode gibt's aber trotzdem. <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="🙂"
    /></p>
</blockquote>
<p>Naja, macht man entweder eine weitere Basisklasse Singvogel, oder findet sich mit der Tatsache ab dass manche Sing() Implementierungen einfach nix tun werden. Da einem sowas oft unterkommt, finde ich das Beispiel diesbezüglich wirklich recht realistisch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1834145</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1834145</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 07 Jan 2010 09:25:34 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Methode on Thu, 07 Jan 2010 09:28:40 GMT]]></title><description><![CDATA[<p>Siehe &quot;Effektiv C++ Programmieren&quot;. Wer auf Mehrfachvererbung oder Runtime-Errors verzeichten will, sollte Alternativen zu virtuellen Funktionen nutzen. (NVI-Idiom, Strategie-Muster)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1834146</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1834146</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Thu, 07 Jan 2010 09:28:40 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Methode on Thu, 07 Jan 2010 09:35:04 GMT]]></title><description><![CDATA[<p>Ad aCTa schrieb:</p>
<blockquote>
<p>Wer auf Mehrfachvererbung oder Runtime-Errors verzeichten will, sollte Alternativen zu virtuellen Funktionen nutzen.</p>
</blockquote>
<p>Den Zusammenhang verstehe ich jetzt nicht. Was ist falsch daran, gewisse Funktionen leer zu implementieren?</p>
<p>Nehmen wir an, ich habe ein GUI-Framework. Dabei hat jede Komponente eine Methode <code>OnEvent()</code> , die bei irgendeinem ankommenden Event entsprechend ausgeführt wird. Da es nun auch Komponenten gibt, welche auf keine Events reagieren (z.B. passive Textanzeigen), lässt man deren Funktionen eben leer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1834151</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1834151</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 07 Jan 2010 09:35:04 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Methode on Thu, 07 Jan 2010 09:37:42 GMT]]></title><description><![CDATA[<p>Ad aCTa schrieb:</p>
<blockquote>
<p>Wobei &quot;Vogel&quot; ja immer so ein schönes Beispiel ist. Nicht jeder Vogel kann singen, die Basisklassenmethode gibt's aber trotzdem. <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="🙂"
    /></p>
</blockquote>
<p>Laut Scott Meyers ist das ja auch i.O. Man macht die Basis-Methode entweder leer oder am besten pure virtual. Und der Vogeltyp der nicht singen oder fliegen kann (z.B. kann ein Pinguin nicht fliegen), implementiert einfach eine leere Methode. Und wird z.B. <code>vogel.fliegen()</code> aufgerufen, passiert halt nichts.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1834153</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1834153</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Thu, 07 Jan 2010 09:37:42 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Methode on Thu, 07 Jan 2010 09:48:28 GMT]]></title><description><![CDATA[<p>Ad aCTa schrieb:</p>
<blockquote>
<p>Siehe &quot;Effektiv C++ Programmieren&quot;. Wer auf Mehrfachvererbung oder Runtime-Errors verzeichten will, sollte Alternativen zu virtuellen Funktionen nutzen. (NVI-Idiom, Strategie-Muster)</p>
</blockquote>
<p>Das NVI-Idiom ist aber keine Alternative zu virtuellen Funktionen sondern eine Erweiterung, die die Bentutzung von virtuellen Funktionen sicherer macht.</p>
<p>Das Strategy-Patter wiederum benutzt selber virtuelle Funktionen, z.B. in der Strategie-Basisklasse. Also kann man auch hier nicht wirklich von Alternativen zu virtuellen Funktionen sprechen. Eine Sing-Stratey würde den Laufzeit-Polymorphismus nur eine indirektion weiter schieben. UNd Laufzeit-Polymorphie ohne virtuelle Funktionen geht nunmal nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1834163</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1834163</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 07 Jan 2010 09:48:28 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Methode on Thu, 07 Jan 2010 22:13:55 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>UNd Laufzeit-Polymorphie ohne virtuelle Funktionen geht nunmal nicht.</p>
</blockquote>
<p>Doch, sicher, z.B. mit Funktionszeigern <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="😃"
    /><br />
*duck-und-weg*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1834732</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1834732</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 07 Jan 2010 22:13:55 GMT</pubDate></item></channel></rss>