<?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[Mal wieder eine Cast-&#x2F;Polymorphismus-Frage]]></title><description><![CDATA[<p>Hallo,</p>
<p>am besten fange ich mit einem Beispiel an:</p>
<pre><code class="language-cpp">class KlasseA {
 ...
};

class KlasseB : public KlasseA {
 public:
 void spezialisierteFunktion(){}
 ...
};

class KlasseC {
 public:
  ...
  void hinzufuegen(KlasseA a, int i) {
   bla[i] = a;
  }

  map&lt;int, KlasseA&gt; erhalteMap() {
   return bla;
  }

 private:
  map&lt;int, KlasseA&gt; bla;
  ...
}

int main() {
 KlasseC c;
 KlasseB b;
 c.hinzufuegen(b, 3);
 map&lt;int KlasseA&gt; blupp = c.erhalteMap();
 KlasseA a = blupp[3];
 KlasseA* pa = &amp;a;

 KlasseB* pb = static_cast&lt;KlasseB*&gt; (pa);
 pb-&gt;spezialisierteFunktion();

 return 0;
}
</code></pre>
<p>Ist der Zugriff auf die spezialisierte Funktion noch möglich? Wie würdet ihr so ein Szenarium implementieren:</p>
<p>Es gibt mehrere von KlasseA abgeleitete Klassen (also nicht nur KlasseB, sondern noch viele mehr), die sich unterschiedlich spezialisieren. In einer KlasseC soll nun eine Methode angeboten werden, solche Klassen zu einer map hinzuzufügen. Kann man da eine map, die die Basisklasse annimmt, verwenden? Gehen die Spezialisierungen dann verloren, wenn ich später wieder Elemente aus der map auslese, diese aber gerne wieder als Objekte der abgeleiteten Klasse hätte? Wie macht man so etwas am sichersten? <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="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/222681/mal-wieder-eine-cast-polymorphismus-frage</link><generator>RSS for Node</generator><lastBuildDate>Sun, 04 Oct 2026 22:43:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/222681.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 16 Sep 2008 08:02:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Mal wieder eine Cast-&#x2F;Polymorphismus-Frage on Tue, 16 Sep 2008 08:02:16 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>am besten fange ich mit einem Beispiel an:</p>
<pre><code class="language-cpp">class KlasseA {
 ...
};

class KlasseB : public KlasseA {
 public:
 void spezialisierteFunktion(){}
 ...
};

class KlasseC {
 public:
  ...
  void hinzufuegen(KlasseA a, int i) {
   bla[i] = a;
  }

  map&lt;int, KlasseA&gt; erhalteMap() {
   return bla;
  }

 private:
  map&lt;int, KlasseA&gt; bla;
  ...
}

int main() {
 KlasseC c;
 KlasseB b;
 c.hinzufuegen(b, 3);
 map&lt;int KlasseA&gt; blupp = c.erhalteMap();
 KlasseA a = blupp[3];
 KlasseA* pa = &amp;a;

 KlasseB* pb = static_cast&lt;KlasseB*&gt; (pa);
 pb-&gt;spezialisierteFunktion();

 return 0;
}
</code></pre>
<p>Ist der Zugriff auf die spezialisierte Funktion noch möglich? Wie würdet ihr so ein Szenarium implementieren:</p>
<p>Es gibt mehrere von KlasseA abgeleitete Klassen (also nicht nur KlasseB, sondern noch viele mehr), die sich unterschiedlich spezialisieren. In einer KlasseC soll nun eine Methode angeboten werden, solche Klassen zu einer map hinzuzufügen. Kann man da eine map, die die Basisklasse annimmt, verwenden? Gehen die Spezialisierungen dann verloren, wenn ich später wieder Elemente aus der map auslese, diese aber gerne wieder als Objekte der abgeleiteten Klasse hätte? Wie macht man so etwas am sichersten? <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="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1582638</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1582638</guid><dc:creator><![CDATA[TheBrain]]></dc:creator><pubDate>Tue, 16 Sep 2008 08:02:16 GMT</pubDate></item><item><title><![CDATA[Reply to Mal wieder eine Cast-&#x2F;Polymorphismus-Frage on Tue, 16 Sep 2008 08:14:18 GMT]]></title><description><![CDATA[<p>TheBrain schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>Grundsätzlich: Wenn es viele Sonderbehandlungen der Klassen gibt, die nicht über eine gemeinsame virtuelle Funktion abgedeckt werden können, tue ich diese auch nicht in einen gemeinsamen Container. Konvertierungen sind teuer, deuten meist von schlechten Code, und sollten die Ausnahme - nicht die Regel - sein.</p>
<p>Wenn es wiederum sehr viele Gemeinsamkeiten gibt, und nur ganz wenige Ausnahmen gibt (z.B. eine einzige Funktion die dann doch eine spezielle Klasse erfordert), dann setze ich auch mal dynamic_cast ein.</p>
<p>Man kann kurz Zusammenfassend sagen: Seltene Casts sind okay, wenn es aber die Regel ist, ist das Design zu überdenken.</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1582645</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1582645</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 16 Sep 2008 08:14:18 GMT</pubDate></item><item><title><![CDATA[Reply to Mal wieder eine Cast-&#x2F;Polymorphismus-Frage on Tue, 16 Sep 2008 14:48:23 GMT]]></title><description><![CDATA[<p>Kann es sein, dass beim Einfügen eines Objektes in eine map ein automatischer, irreversibler Upcast stattfindet?</p>
<p>Gibt es denn kein &quot;Best Practice&quot; für mein Problem? Ich schildere es noch mal kurz:</p>
<p>Eine Basisklasse, viele davon abgeleitete Klassen. In einem Programm möchte ich nun eine Map als Member, die mit all diesen abgeleiteten Klassen umgehen kann, dafür würde ich gerne map&lt;int, Basisklasse&gt; verwenden. Außerdem brauche ich eine Methode, die Elemente in die Map einfügt, die also z. B. folgende Schnittstelle hat: void insertIntoMap(Basisklasse b, int i);<br />
Geht das alles irgendwie ohne dieses nervige Rumgecaste (dynamic_cast/static_cast)?<br />
Klar, ich könnte auch für jede Kindklasse im Programm einen eigenen Konstruktor un ein eigenes Member haben, aber das ist ja völlig unflexibel und statisch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1582910</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1582910</guid><dc:creator><![CDATA[TheBrain]]></dc:creator><pubDate>Tue, 16 Sep 2008 14:48:23 GMT</pubDate></item><item><title><![CDATA[Reply to Mal wieder eine Cast-&#x2F;Polymorphismus-Frage on Tue, 16 Sep 2008 14:32:35 GMT]]></title><description><![CDATA[<p>TheBrain schrieb:</p>
<blockquote>
<p>Kann es sein, dass beim Einfügen eines Objektes in eine ein automatischer, irreversibler Upcast stattfindet?</p>
</blockquote>
<p>Nein, es findet höchstens eine Umwandlung in die Basisklasse statt, weil Du Objekte in der Map speicherst. Das ist etwas anderes als ein Cast, weil das Objekt so seinen abgeleiteten Teil vollständig verliert. Du musst Zeiger in der Map speichern, damit Polymorphie erhalten bleibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1582919</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1582919</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 16 Sep 2008 14:32:35 GMT</pubDate></item><item><title><![CDATA[Reply to Mal wieder eine Cast-&#x2F;Polymorphismus-Frage on Tue, 16 Sep 2008 14:52:05 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Nein, es findet höchstens eine Umwandlung in die Basisklasse statt ... weil das Objekt so seinen abgeleiteten Teil vollständig verliert. Du musst Zeiger in der Map speichern, damit Polymorphie erhalten bleibt.</p>
</blockquote>
<p>Ok, das meinte ich ja mit irreversiblem Upcast *g*</p>
<p>Danke für den Hinweis mit der Polymorphie!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1582937</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1582937</guid><dc:creator><![CDATA[TheBrain]]></dc:creator><pubDate>Tue, 16 Sep 2008 14:52:05 GMT</pubDate></item><item><title><![CDATA[Reply to Mal wieder eine Cast-&#x2F;Polymorphismus-Frage on Tue, 16 Sep 2008 16:23:24 GMT]]></title><description><![CDATA[<p>Das ganze nennt man auch &quot;Slicing&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1582995</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1582995</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 16 Sep 2008 16:23:24 GMT</pubDate></item></channel></rss>