<?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[Problem mit Polymorphie]]></title><description><![CDATA[<p>Hi,<br />
hier erstmal ein Beispielcode, der das Problem erläutert:</p>
<pre><code class="language-cpp">class foo
{
public:
  virtual void speak() {...}
private:

};

class bar : public foo
{
public:
  virtual void speak() {...}
  void run() {...}
private:
};

int main()
{
 foo* test = new bar();
 test-&gt;speak(); //funktioniert
 test-&gt;run();  // funktioniert nicht
}
</code></pre>
<p>Wieso bekomme ich bei dem Aufruf von run() die Meldung, dass run() kein Member von foo ist? Eigentlich sollte er doch die Version von bar aufrufen. Wie kann ich es machen, dass das ganze funktioniert? Ich will eigentlich keine abstrakte Funktion run() in meiner Basisklasse einfügen, weil das ja nicht der Sinn von Vererbung ist...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/192170/problem-mit-polymorphie</link><generator>RSS for Node</generator><lastBuildDate>Sun, 27 Sep 2026 09:20:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/192170.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 11 Sep 2007 12:24:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Polymorphie on Tue, 11 Sep 2007 12:24:58 GMT]]></title><description><![CDATA[<p>Hi,<br />
hier erstmal ein Beispielcode, der das Problem erläutert:</p>
<pre><code class="language-cpp">class foo
{
public:
  virtual void speak() {...}
private:

};

class bar : public foo
{
public:
  virtual void speak() {...}
  void run() {...}
private:
};

int main()
{
 foo* test = new bar();
 test-&gt;speak(); //funktioniert
 test-&gt;run();  // funktioniert nicht
}
</code></pre>
<p>Wieso bekomme ich bei dem Aufruf von run() die Meldung, dass run() kein Member von foo ist? Eigentlich sollte er doch die Version von bar aufrufen. Wie kann ich es machen, dass das ganze funktioniert? Ich will eigentlich keine abstrakte Funktion run() in meiner Basisklasse einfügen, weil das ja nicht der Sinn von Vererbung ist...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1363252</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1363252</guid><dc:creator><![CDATA[Amateur as Guest]]></dc:creator><pubDate>Tue, 11 Sep 2007 12:24:58 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Polymorphie on Tue, 11 Sep 2007 12:27:20 GMT]]></title><description><![CDATA[<p>test ist ein Pointer auf ein foo-Objekt, und wird auch so behandelt. Auch wenn in wirklichkeit ein bar-Objekt dahinter steht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1363261</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1363261</guid><dc:creator><![CDATA[The-Kenny]]></dc:creator><pubDate>Tue, 11 Sep 2007 12:27:20 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Polymorphie on Tue, 11 Sep 2007 12:27:39 GMT]]></title><description><![CDATA[<p>Amateur as Guest schrieb:</p>
<blockquote>
<p>Wieso bekomme ich bei dem Aufruf von run() die Meldung, dass run() kein Member von foo ist? Eigentlich sollte er doch die Version von bar aufrufen. Wie kann ich es machen, dass das ganze funktioniert? Ich will eigentlich keine abstrakte Funktion run() in meiner Basisklasse einfügen, weil das ja nicht der Sinn von Vererbung ist...</p>
</blockquote>
<p>Genau das ist aber der Sinn von Polymorhpie. Foo hat kein Member run(), das siehst Du auf den ersten Blick, der Compiler natürlich erst recht. Wenn so etwas gehen würde, wofür bräuchte man dann &quot;virtual void speak()&quot;? Richtig, garnicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1363262</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1363262</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 11 Sep 2007 12:27:39 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Polymorphie on Tue, 11 Sep 2007 12:29:13 GMT]]></title><description><![CDATA[<p>Willst du es dirty machen, dann caste test auf bar* <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_down"
      title=":-1:"
      alt="👎"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1363264</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1363264</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 11 Sep 2007 12:29:13 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Polymorphie on Tue, 11 Sep 2007 12:32:11 GMT]]></title><description><![CDATA[<p>...willst Du es sauber machen, dann benutzt Du dynamic_cast und überprüfst, ob der Cast erfolgreich war <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1363268</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1363268</guid><dc:creator><![CDATA[~Airdamn]]></dc:creator><pubDate>Tue, 11 Sep 2007 12:32:11 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Polymorphie on Tue, 11 Sep 2007 12:38:44 GMT]]></title><description><![CDATA[<p>Hmm, dann hab ich wohl den Sinn hinter der Polymorphie noch nicht verstanden.<br />
Im Endeffekt muss ich die Polymorphie dann weglassen und ein Objekt von meiner abgeleiteten Klasse erstellen oder? Dann dürfte es funktionieren... Nur wozu brauche ich dann die Polymorphie wenn nicht für so etwas wie ich es oben geschildert habe?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1363282</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1363282</guid><dc:creator><![CDATA[Amateur as Guest]]></dc:creator><pubDate>Tue, 11 Sep 2007 12:38:44 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Polymorphie on Tue, 11 Sep 2007 12:57:11 GMT]]></title><description><![CDATA[<p>Amateur as Guest schrieb:</p>
<blockquote>
<p>...Nur wozu brauche ich dann die Polymorphie wenn nicht für so etwas wie ich es oben geschildert habe?</p>
</blockquote>
<p>Polymorphie nutzt Du dann, wenn verschiedene Klassen <em>dieselbe Schnittstelle</em> anbieten UND Du nicht zu wissen brauchst, wie das konkrete Objekt diese Schnittstelle implementiert.</p>
<p>Wenn Du z.B. alle Fahrzeuge &quot;fahren&quot; lassen willst, kannst Du das mittels</p>
<pre><code class="language-cpp">vector&lt;Fahrzeug*&gt; fahrzeuge;
fahrzeuge.push_back(new Fahrrad);
fahrzeuge.push_back(new Mofa);
fahrzeuge.push_back(new LKW);

for(size_t i=0; i&lt;fahrzeuge.size(); ++i) {
   fahrzeuge[i]-&gt;fahre();
}

// .. später delete nicht vergessen
</code></pre>
<p>In Deinem Beispiel ist diese Bedingung nicht erfüllt.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1363301</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1363301</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 11 Sep 2007 12:57:11 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Polymorphie on Tue, 11 Sep 2007 13:00:59 GMT]]></title><description><![CDATA[<p>Dummes Lehrbuchbeispiel:</p>
<pre><code class="language-cpp">class Fahrzeug
{
   public:
    virtual void GibGas();
}

class Auto: public Fahrzeug
{
   public:
   virtual void GibGas() //ob du hier das virtual mit anführst ist Geschmackssache
   {
       TrittGaspedal();
   }
   private:
   void TrittGaspedal();
}

class Moped : public Fahrzeug
{
 public:
  virtual void GibGas()
  {
     DreheGasgriff();
  }
private:
  void DreheGasgriff();
}

int main()
{
   std::vector&lt;Fahrzeug&gt; Garage;

   Auto Mercedes;
   Moped Simson; //ja, ich bin  aus dem Osten :D

   //Der Garage ist es egal, was drinsteht
   Garage.push_back(Mercedes);
   Garage.push_back(Simson);

   Garage[0].GibGas(); //Fahr den Mercedes raus
   Garage[1].GibGas(); //Fahr das Moped raus
   ...
}
</code></pre>
<p>Grüße,</p>
<p>Martin</p>
<p>Edit: <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13624">@Simon2</a>: Zwei Doofe, ein Gedanke <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/1363316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1363316</guid><dc:creator><![CDATA[JimmydaMage]]></dc:creator><pubDate>Tue, 11 Sep 2007 13:00:59 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Polymorphie on Tue, 11 Sep 2007 13:06:11 GMT]]></title><description><![CDATA[<p>Hmmm,<br />
so habe ich mir das ja auch gedacht... Aber in deinem Beispiel könnte ich ja z.B. nicht dem LKW eine spezifische Methode verpassen, die meine Fahrzeugschnittstelle nicht besitzt, und diese Methode dann über einen Fahrzeugpointer aufrufen. Sondern um an die Methode zu kommen brauche ich dann entweder nen Cast oder einen LKW Pointer.<br />
Oder anders gesagt, Polymorphie verwende ich nur dann, wenn ich mehrere Objekte habe, die alle eine Methode verwenden, die auch in meiner Basisklasse vorkommt... Wenn ich eine Funktion benötige, die nicht in meiner Basisklasse vorkommt, verzichte ich auf Polymorphie und verwende ein Objekt meiner abgeleiteten Klasse???</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1363322</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1363322</guid><dc:creator><![CDATA[Amateur as Guest]]></dc:creator><pubDate>Tue, 11 Sep 2007 13:06:11 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Polymorphie on Tue, 11 Sep 2007 13:30:39 GMT]]></title><description><![CDATA[<p>Den Downcast sollte man in jedem Fall versuchen zu vermeiden...<br />
Besser ist, dort wo du auf die Methoden deiner abgeleiteten Klasse zugreifen musst, eine eigene Referenz auf die abgeleitete Klasse zu behalten, und/oder der Basisklasse eine virtuelle Methode &quot;MachDeinZeug()&quot; zu verpassen, und der abgeleiteten Klasse soviel Eigenintelligenz zu spendieren, dass sie selbst weiß, was zu tun ist.<br />
Das würde auch dem Grundprinzip der Eigenverantwortlichkeit der Objekte entsprechen...</p>
<p>Grüße,</p>
<p>Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1363350</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1363350</guid><dc:creator><![CDATA[JimmydaMage]]></dc:creator><pubDate>Tue, 11 Sep 2007 13:30:39 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Polymorphie on Wed, 12 Sep 2007 07:15:57 GMT]]></title><description><![CDATA[<p>Also die sauberste Methode wäre es die Funktion run() in der Basisklasse zu deklarieren. Scheint mir eine allgemeine Funktion zu sein. <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>
<p>Dein Problem an der Stelle ist nicht die Polymorphie sondern die Definition der Schnittstelle. Wenn du einen Verweis auf die Oberklasse hast, kannst du auch nur über deren Schnittstelle auf das konkrete Objekt zugreifen.</p>
<p>Erst durch diese Einschränkung wird es möglich Objekte unterschiedlichen Typs über die gleiche Schnittstelle anzusprechen. Ansonsten ergäbe sich bei der von foo abgeleiteten Klasse bar2, die keine Funktion run () besitzt ein kleines Problem....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1363791</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1363791</guid><dc:creator><![CDATA[MathiasTemp]]></dc:creator><pubDate>Wed, 12 Sep 2007 07:15:57 GMT</pubDate></item></channel></rss>