<?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[Vererbung und Neuerstellung von Klassen]]></title><description><![CDATA[<p>hallo,</p>
<p>folgendes Problem:</p>
<pre><code class="language-cpp">class Mom
{...};

class KidA
{...};

class KidB
{...};

void replace_nth_kid(std::list&lt;Mom*&gt; kids, n)
{
   Mom * nth_kid = get_nth_kid(kids, n);
   delete nth_kid;
   nth_kid = new &lt;PROBLEM&gt;
   set_nth_kid(nth_kid, n);
}
</code></pre>
<p>an der mit &lt;PROBLEM&gt; gekennzeichneten Stelle möchte ich eine Instanz der Klasse KidA oder KidB erstellen, je nachdem ob der alte Eintrag ein KidA oder KidB war. Wie geht das?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/248446/vererbung-und-neuerstellung-von-klassen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 02:34:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/248446.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 25 Aug 2009 05:57:55 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vererbung und Neuerstellung von Klassen on Tue, 25 Aug 2009 05:57:55 GMT]]></title><description><![CDATA[<p>hallo,</p>
<p>folgendes Problem:</p>
<pre><code class="language-cpp">class Mom
{...};

class KidA
{...};

class KidB
{...};

void replace_nth_kid(std::list&lt;Mom*&gt; kids, n)
{
   Mom * nth_kid = get_nth_kid(kids, n);
   delete nth_kid;
   nth_kid = new &lt;PROBLEM&gt;
   set_nth_kid(nth_kid, n);
}
</code></pre>
<p>an der mit &lt;PROBLEM&gt; gekennzeichneten Stelle möchte ich eine Instanz der Klasse KidA oder KidB erstellen, je nachdem ob der alte Eintrag ein KidA oder KidB war. Wie geht das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1766162</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1766162</guid><dc:creator><![CDATA[Karlheinz Stockhausen]]></dc:creator><pubDate>Tue, 25 Aug 2009 05:57:55 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung und Neuerstellung von Klassen on Tue, 25 Aug 2009 06:12:00 GMT]]></title><description><![CDATA[<p>Korrigierter Code:</p>
<pre><code class="language-cpp">class Mom
{...};

class KidA : public Mom
{...};

class KidB : public Mom
{...};

void replace_nth_kid(std::list&lt;Mom*&gt; kids, n)
{
   Mom * nth_kid = get_nth_kid(kids, n);
   delete nth_kid;
   nth_kid = new &lt;PROBLEM&gt;
   set_nth_kid(nth_kid, n);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1766164</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1766164</guid><dc:creator><![CDATA[Karlheinz Stockhausen]]></dc:creator><pubDate>Tue, 25 Aug 2009 06:12:00 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung und Neuerstellung von Klassen on Tue, 25 Aug 2009 06:34:21 GMT]]></title><description><![CDATA[<p>Du könntest in KidA und KidB jeweils eine Funktion definieren, die den gewünschten Typ erzeugt.</p>
<pre><code class="language-cpp">class Mom
{
    virtual Mom* createNew() const = 0;
};

class KidA : public Mom
{
   Mom* createNew() const { return new KidA(); }
};

class KidB : public Mom
{
   Mom* createNew() const { return new KidB(); }
};

void replace_nth_kid(std::list&lt;Mom*&gt; kids, n)
{
   Mom * nth_kid = get_nth_kid(kids, n);
   Mom * new_kid = nth_kid-&gt;createNew();
   delete nth_kid;
   nth_kid = new_kid;
   set_nth_kid(nth_kid, n);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1766165</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1766165</guid><dc:creator><![CDATA[Registrierter Troll]]></dc:creator><pubDate>Tue, 25 Aug 2009 06:34:21 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung und Neuerstellung von Klassen on Tue, 25 Aug 2009 06:34:22 GMT]]></title><description><![CDATA[<p>Das ist ja Menschenverachtend, dein Design!!!<br />
Trotzdem: Eine Lösung geht wohl über eine pure-virtual-Funktion in Mom, die KidA und KidB implementieren müssen.<br />
Zurückgegeben wird ein identifier (enum, int, oder auch string), anhand dessen ein KidA oder KidB identifiziert werden kann. Diesen mit if()s identifizieren und entsprechend neu erstellen.<br />
Alternativ prüfen ob ein dynamic_cast&lt;&gt;() nicht NULL zurückgibt.</p>
<p>Aber Kinder ersetzen... ich bin immer noch ganz entsetzt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1766166</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1766166</guid><dc:creator><![CDATA[uneSCO]]></dc:creator><pubDate>Tue, 25 Aug 2009 06:34:22 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung und Neuerstellung von Klassen on Tue, 25 Aug 2009 06:37:40 GMT]]></title><description><![CDATA[<p>Füge in Mom eine virtuelle Funktion ein, die auf dem &quot;alten&quot; Objekt aufrufst und ein neues Objekt erzeugt -- statt das alte Objekt sofort zu löschen.</p>
<pre><code class="language-cpp">void replace_nth_kid(std::list&lt;Mom*&gt; kids, n)
{
   Mom * nth_kid  = get_nth_kid(kids, n);
   Mom * nth_kid2 = nth_kid-&gt;neu(....);
   delete nth_kid;
   set_nth_kid(nth_kid2, n);
}
</code></pre>
<p>dynamic_cast gibt's auch noch. Solltest Du aber vermeiden, wenn's geht.</p>
<p>Achte auf Ausnahme-Sicherheit (Kann set_nth_kid eine Ausnahme werfen?)</p>
<p>Mit etwas mehr Kontext drumherum hätte man Dir eventuell eine elegantere Lösung anbieten können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1766167</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1766167</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Tue, 25 Aug 2009 06:37:40 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung und Neuerstellung von Klassen on Tue, 25 Aug 2009 06:37:14 GMT]]></title><description><![CDATA[<p>Mit dem <em>virtual Constructor Idiom</em>.</p>
<p>Edit: zu spät ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1766169</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1766169</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Tue, 25 Aug 2009 06:37:14 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung und Neuerstellung von Klassen on Tue, 25 Aug 2009 07:10:02 GMT]]></title><description><![CDATA[<p>uneSCO schrieb:</p>
<blockquote>
<p>Eine Lösung geht wohl über eine pure-virtual-Funktion in Mom, die KidA und KidB implementieren müssen.<br />
Zurückgegeben wird ein identifier (enum, int, oder auch string), anhand dessen ein KidA oder KidB identifiziert werden kann. Diesen mit if()s identifizieren und entsprechend neu erstellen.</p>
</blockquote>
<p>Eine suboptimale Lösung. Du nutzt Polymorphie, um den Typen zu identifizieren und machst dann ein ggf. großes switch/case-statement um anhand der Identifizierung ein neues Objekt vom richtigen Typ zu erzeugen - warum nicht gleich Polymorphie nutzen um gleich das richtige Objekt zu erzeugen, wie es andere schon gezeigt haben? So gehst du nur den halben Weg.</p>
<blockquote>
<p>Alternativ prüfen ob ein dynamic_cast&lt;&gt;() nicht NULL zurückgibt.</p>
</blockquote>
<p>Was dann die noch schlechtere Variante ist, wo du überhaupt nicht mehr die Hilfsmittel nutzt, die dir die Sprache zur Verfügung stellt, sondern alles gleich mühsam &quot;zu Fuß&quot; machst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1766180</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1766180</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 25 Aug 2009 07:10:02 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung und Neuerstellung von Klassen on Tue, 25 Aug 2009 07:18:52 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Eine suboptimale Lösung. Du nutzt Polymorphie, um den Typen zu identifizieren und machst dann ein ggf. großes switch/case-statement um anhand der Identifizierung ein neues Objekt vom richtigen Typ zu erzeugen - warum nicht gleich Polymorphie nutzen um gleich das richtige Objekt zu erzeugen, wie es andere schon gezeigt haben? So gehst du nur den halben Weg.</p>
</blockquote>
<p>na super, wenn ich das virtual constructor idiom verwende, muss ich genau so viel machen (in jedem meiner N Kinder die copy-funktion implementieren...)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1766185</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1766185</guid><dc:creator><![CDATA[Karlheinz Stockhausen]]></dc:creator><pubDate>Tue, 25 Aug 2009 07:18:52 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung und Neuerstellung von Klassen on Tue, 25 Aug 2009 07:25:20 GMT]]></title><description><![CDATA[<p>Karlheinz Stockhausen schrieb:</p>
<blockquote>
<p>pumuckl schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>na super, wenn ich das virtual constructor idiom verwende, muss ich genau so viel machen (in jedem meiner N Kinder die copy-funktion implementieren...)</p>
</blockquote>
<p>Stimmt, aber du musst bei einer zusätzlichen Kindklasse auch nur dort die copy-Funktion implementieren und fertig. Andernfalls müsstest du dort die Klassenid-Funktion implementieren und an jeder Stelle, wo du sie verwendest (das Neuerzeugen wird über kurz oder lang nicht der einzige Fall sein) das switch-staement erweitern. Du müsstest also um eine neue Klasse anzulegen, die anderen Klassen jedesmal wieder anpacken und neu compilieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1766187</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1766187</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 25 Aug 2009 07:25:20 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung und Neuerstellung von Klassen on Tue, 25 Aug 2009 08:06:43 GMT]]></title><description><![CDATA[<p>Karlheinz Stockhausen schrieb:</p>
<blockquote>
<p>...na super, wenn ich das virtual constructor idiom verwende, muss ich genau so viel machen ...</p>
</blockquote>
<p>Stimmt ja gar nicht. Wenn Du über &quot;ID&quot; gehst, muss<br />
- jedes Kind eine &quot;ID&quot;-Funktion bereitstellen (sonst eben eine &quot;new&quot;-Funktion) UND<br />
- irgendwo eine &quot;Erzeugerfunktion&quot; bereitstellen (und für jedes neue Kind mitpflegen).<br />
Du hast also eine Funktion(alität) und eine Abhängigkeit mehr.</p>
<p>Außerdem solltest Du nicht vergessen, dass Du garantiert irgendwann zu dem Problem kommst, dass die &quot;Kinder&quot; über unterschiedliche Ctor-Argumente konstruiert werden ... und dann wird's eng mit dem jetzigen Design (und mit &quot;IDs&quot; erst recht).</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1766204</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1766204</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 25 Aug 2009 08:06:43 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung und Neuerstellung von Klassen on Tue, 25 Aug 2009 08:30:31 GMT]]></title><description><![CDATA[<p>Ich frage besser garnicht wieso ein Kind ein spezialisierung einer Mom ist oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1766220</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1766220</guid><dc:creator><![CDATA[fggdhjfgjhfghf]]></dc:creator><pubDate>Tue, 25 Aug 2009 08:30:31 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung und Neuerstellung von Klassen on Tue, 25 Aug 2009 08:34:17 GMT]]></title><description><![CDATA[<p>Im übrigen kann sich beim <code>virtual constructor idom</code> der Rückgabewert der virtuellen Funktion verändern. Kann auch sehr praktisch sein.<br />
<a href="http://www.parashift.com/c++-faq-lite/virtual-functions.html#faq-20.8" rel="nofollow">http://www.parashift.com/c++-faq-lite/virtual-functions.html#faq-20.8</a></p>
<p>Oder schnell auf deinen Code angewendet:</p>
<pre><code class="language-cpp">class Mom
{
    virtual Mom* clone() const = 0 { /* default implementation? */ };
};

class KidA : public Mom
{
   KidA* clone() const { return new KidA(*this); }
};

class KidB : public Mom
{
   KidB* clone() const { return new KidB(*this); }
};
</code></pre>
<p>fggdhjfgjhfghf schrieb:</p>
<blockquote>
<p>Ich frage besser garnicht wieso ein Kind ein spezialisierung einer Mom ist oder?</p>
</blockquote>
<p>Naja, wohl aus dem einfachen Gedanken heraus, dass ein Kind womöglich unter Umständen auch eine Mutter sein kann. Allerdings finde ich die Frage nicht unberechtigt. Denn die <em>is-a</em> ist nicht eine womöglich Beziehung <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 />
Auch dass es ein <code>KidA</code> und <code>KidB</code> geben soll, halte ich für ein sehr seltsames Design.<br />
Aber womöglich waren es auch einfach nur ein wenig schlecht gewählte Platzhalter.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1766223</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1766223</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 25 Aug 2009 08:34:17 GMT</pubDate></item></channel></rss>