<?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[Kopierkonstruktor und Polymorphie]]></title><description><![CDATA[<p>Hallo zusammen</p>
<p>Ganz blöde Frage, aber irgendwie komme ich einfach nicht zu einer Lösung. Ich hab zwei Klassen A und davon abgeleitet B. Jz mach ich mir eine verkettete Liste, wo ich allerdings mit List::add(A const&amp;) jeweils nur eine Kopie in die Liste und nicht das originale Element einfügen möchte. Jz kann es sein, dass ich auch Instanzen von B in meine Liste hinzufügen möchte. Wenn ich in List::add() nun den Kopierkonstruktor aufrufe, weiß der Compiler zur Compile-Time ja nicht, welches Objekt da reingehört, und welchen Kopierkonstruktor er aufrufen soll. (bzw er ruft einfach den von A auf). Wie löst man sowas?</p>
<p>Vl noch kurz und bündig das ganze in Code:</p>
<pre><code class="language-cpp">class A {
    // ...
    A( A const&amp;);
}

class B : public A {
    // ...
    B( B const&amp;);
}

// ...

void List::add(A const&amp; A_) {
    // make a copy
    A ourCopy( A_ );
}

int main() {
    // ...
    A a;
    B b;
    list.add(a);
    list.add(b); // &lt;- hier wird eben nur der &quot;A-Teil&quot; von B kopiert
}
</code></pre>
<p>Als eine Möglichkeit fällt mir ein eine virtuelle copy-Funktion in A zu scrheiben, die in B auch implementiert wird, und dass List::add() eben diese Funktion aufruft, aber ghet das nicht etwas schöner?</p>
<p>Danke auf jeden Fall!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/286317/kopierkonstruktor-und-polymorphie</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 23:57:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/286317.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 07 May 2011 16:55:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kopierkonstruktor und Polymorphie on Sat, 07 May 2011 16:55:18 GMT]]></title><description><![CDATA[<p>Hallo zusammen</p>
<p>Ganz blöde Frage, aber irgendwie komme ich einfach nicht zu einer Lösung. Ich hab zwei Klassen A und davon abgeleitet B. Jz mach ich mir eine verkettete Liste, wo ich allerdings mit List::add(A const&amp;) jeweils nur eine Kopie in die Liste und nicht das originale Element einfügen möchte. Jz kann es sein, dass ich auch Instanzen von B in meine Liste hinzufügen möchte. Wenn ich in List::add() nun den Kopierkonstruktor aufrufe, weiß der Compiler zur Compile-Time ja nicht, welches Objekt da reingehört, und welchen Kopierkonstruktor er aufrufen soll. (bzw er ruft einfach den von A auf). Wie löst man sowas?</p>
<p>Vl noch kurz und bündig das ganze in Code:</p>
<pre><code class="language-cpp">class A {
    // ...
    A( A const&amp;);
}

class B : public A {
    // ...
    B( B const&amp;);
}

// ...

void List::add(A const&amp; A_) {
    // make a copy
    A ourCopy( A_ );
}

int main() {
    // ...
    A a;
    B b;
    list.add(a);
    list.add(b); // &lt;- hier wird eben nur der &quot;A-Teil&quot; von B kopiert
}
</code></pre>
<p>Als eine Möglichkeit fällt mir ein eine virtuelle copy-Funktion in A zu scrheiben, die in B auch implementiert wird, und dass List::add() eben diese Funktion aufruft, aber ghet das nicht etwas schöner?</p>
<p>Danke auf jeden Fall!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2060105</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2060105</guid><dc:creator><![CDATA[blitzmaster]]></dc:creator><pubDate>Sat, 07 May 2011 16:55:18 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor und Polymorphie on Sat, 07 May 2011 17:37:10 GMT]]></title><description><![CDATA[<p>Nein, das geht nicht.<br />
Erstell die Objekte mit <code>new</code> und speichere die Zeiger in der Liste.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2060123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2060123</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Sat, 07 May 2011 17:37:10 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor und Polymorphie on Sat, 07 May 2011 19:03:51 GMT]]></title><description><![CDATA[<p>In der Liste speichere ich natürlich nur die Zeiger auf die Objekte. Aber eben Zeige auf A. Und was wenn ich nun eine Instanz von B in List::add() übergeben bekomme...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2060145</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2060145</guid><dc:creator><![CDATA[blitzmaster]]></dc:creator><pubDate>Sat, 07 May 2011 19:03:51 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor und Polymorphie on Sat, 07 May 2011 19:08:26 GMT]]></title><description><![CDATA[<p>blitzmaster schrieb:</p>
<blockquote>
<p>In der Liste speichere ich natürlich nur die Zeiger auf die Objekte. Aber eben Zeige auf A. Und was wenn ich nun eine Instanz von B in List::add() übergeben bekomme...</p>
</blockquote>
<p>Das sieht hier aber ganz anders aus.</p>
<pre><code class="language-cpp">void List::add(A const&amp; A_) {
    // make a copy
    A ourCopy( A_ );
}
</code></pre>
<p>Wo speicherst du irgendwas?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2060147</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2060147</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Sat, 07 May 2011 19:08:26 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor und Polymorphie on Sat, 07 May 2011 19:18:02 GMT]]></title><description><![CDATA[<p>Ja das stimmt, das habe ich etwas ungenau/falsch skizziert:</p>
<pre><code class="language-cpp">void List::add(A const&amp; A_) {
   // ...
   A* ourCopy = new A( A_ );
   // den pointer A* dann an den richtigen Knoten weitergeben
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2060150</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2060150</guid><dc:creator><![CDATA[blitzmaster]]></dc:creator><pubDate>Sat, 07 May 2011 19:18:02 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor und Polymorphie on Sat, 07 May 2011 19:30:55 GMT]]></title><description><![CDATA[<p>Solange du nur Zeiger oder Referenzen auf die übergebenen Objekte speicherst, brauchst du dir keine Gedanken darüber machen, ob das jetzt ein A oder ein B (oder etwas anderes) ist. Aber natürlich mußt du dich dann darum kümmern, daß die Objekte selber länger überleben als die Verweise, die du auf sie angelegt hast.</p>
<p>Wenn die Liste Kopien der übergebenen Objekte speichern will, muß sie das über Zeiger erledigen und sich auch möglichst selber um die Verwaltung kümmern. Da kann dann eine virtuelle clone()-Methode in der Klasse hilfreich sein, um eine komplette Kopie zu erzeugen.<br />
Eine Alternative wäre noch Compilezeit-Polymorphie mittels Templates:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
List::add(T const&amp; obj)
{
  A* ptr = new T(obj);//das sollte nur für A und Nachkommen übersetzen
  ...
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2060151</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2060151</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 07 May 2011 19:30:55 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor und Polymorphie on Sat, 07 May 2011 19:29:05 GMT]]></title><description><![CDATA[<p>Ja, Templates habe ich auch schon gedacht... Aber das wollte ich vermeiden... Ich werds jetzt einfach mit einer virtuellen copy-funktion machen. Ich dachte nur vielleicht geht das irgendwie eleganter, aber na gut. Danke euch beiden auf jeden Fall!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2060153</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2060153</guid><dc:creator><![CDATA[blitzmaster]]></dc:creator><pubDate>Sat, 07 May 2011 19:29:05 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor und Polymorphie on Sat, 07 May 2011 21:33:47 GMT]]></title><description><![CDATA[<p>blitzmaster schrieb:</p>
<blockquote>
<p>Ich werds jetzt einfach mit einer virtuellen copy-funktion machen. Ich dachte nur vielleicht geht das irgendwie eleganter, aber na gut.</p>
</blockquote>
<p>Das ist die übliche Art es zu machen.<br />
Elegantere Möglichkeit ist mir keine bekannt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2060207</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2060207</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 07 May 2011 21:33:47 GMT</pubDate></item></channel></rss>