<?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[Copy-Konstruktor]]></title><description><![CDATA[<p>Hallo zusammen...</p>
<p>Wenn ich ne Klasse hab, in der ich nen Copy-Konstruktor aufrufe,<br />
wird dann automatisch (wenn nötig) die richtige Unterklasse aufgerufen?</p>
<pre><code class="language-cpp">class ClazzA{

}

class ClazzB : public ClassA{

}

class Clazz{
public:
  void method(ClassA* clazz);

private:
  ClazzA* clazz;
}
</code></pre>
<pre><code class="language-cpp">void Clazz:method(ClassA* clazz){
  this-&gt;clazz = new ClazzA(*clazz);
}
</code></pre>
<p>Was passiert, wenn ich nen ClazzB-Object übergebe?<br />
Ruft er dann den Copy-Konstruktor von ClazzB auf?</p>
<p>Gruß,<br />
CSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/118678/copy-konstruktor</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 14:22:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/118678.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 23 Aug 2005 09:05:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Copy-Konstruktor on Tue, 23 Aug 2005 09:05:53 GMT]]></title><description><![CDATA[<p>Hallo zusammen...</p>
<p>Wenn ich ne Klasse hab, in der ich nen Copy-Konstruktor aufrufe,<br />
wird dann automatisch (wenn nötig) die richtige Unterklasse aufgerufen?</p>
<pre><code class="language-cpp">class ClazzA{

}

class ClazzB : public ClassA{

}

class Clazz{
public:
  void method(ClassA* clazz);

private:
  ClazzA* clazz;
}
</code></pre>
<pre><code class="language-cpp">void Clazz:method(ClassA* clazz){
  this-&gt;clazz = new ClazzA(*clazz);
}
</code></pre>
<p>Was passiert, wenn ich nen ClazzB-Object übergebe?<br />
Ruft er dann den Copy-Konstruktor von ClazzB auf?</p>
<p>Gruß,<br />
CSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/856677</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/856677</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 23 Aug 2005 09:05:53 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Konstruktor on Tue, 23 Aug 2005 09:14:29 GMT]]></title><description><![CDATA[<p>Der Comiler tut das was du ihm sagst:</p>
<pre><code class="language-cpp">new ClazzA(*clazz);
</code></pre>
<p>=&gt; Erzeugt ein Objekt der Klasse ClazzA und initialisiert sie mit den Werten<br />
von clazz.</p>
<p>Ich nehme mal an, dass du das Objekt clazz kopieren/klonen möchtest. Hierzu musst du dir eine virtuelle Clone-Funktion in ClazzA schreiben, die den Kopierkonstruktor von ClazzA aufruft und in ClazzB die Funktion überschreiben und dort den Kopierkonstruktor von ClassB aufrufen.</p>
<p>In ClassZ rufst du dann clazz-&gt;clone () auf und bekommst dann die gewünschte Kopie...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/856687</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/856687</guid><dc:creator><![CDATA[Mathias]]></dc:creator><pubDate>Tue, 23 Aug 2005 09:14:29 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Konstruktor on Tue, 23 Aug 2005 09:17:29 GMT]]></title><description><![CDATA[<p>So, wie ich das verstanden hab', dann ruft er auch bei einem clazzB-Objekt den CopyCtor von clazzA auf, da Du ja explizit ein classA-Objekt erstellst. Wenn Du daraus allerdings eine Template-Member-Funktion machst, dann sollte je übergebenen Objekt der entsprechende CopyCtor aufgerufen werden, also:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
void method(T* obj) {
    this-&gt;clazz = new T(*obj);
}
</code></pre>
<p>Soweit ich das aber nun verstanden habe müsstest Du den CopyCtor evtl. als virtual deklarieren, damit das problemlos klappt.</p>
<p>@diejenigen, die mehr Ahnung haben: Falls ich mich irre, dann bitte nicht steinigen, sondern nur korrigieren. <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/856692</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/856692</guid><dc:creator><![CDATA[mantiz]]></dc:creator><pubDate>Tue, 23 Aug 2005 09:17:29 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Konstruktor on Tue, 23 Aug 2005 09:23:07 GMT]]></title><description><![CDATA[<p>Ich hab auch schon an einen virtuellen Kostruktor gedacht,<br />
aber ich meine gelesen zu haben, dass sowas sinnlos ist...</p>
<p>Das mit der virtuellen Methode clone hätte ich sonst auch gemacht...</p>
<p>Gruß,<br />
CSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/856703</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/856703</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 23 Aug 2005 09:23:07 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Konstruktor on Tue, 23 Aug 2005 09:23:35 GMT]]></title><description><![CDATA[<p>mantiz schrieb:</p>
<blockquote>
<p>Soweit ich das aber nun verstanden habe müsstest Du den CopyCtor evtl. als virtual deklarieren, damit das problemlos klappt.</p>
</blockquote>
<p>Leider nicht<br />
<a href="http://www.research.att.com/~bs/bs_faq2.html#virtual-ctor" rel="nofollow">http://www.research.att.com/~bs/bs_faq2.html#virtual-ctor</a><br />
Kurt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/856704</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/856704</guid><dc:creator><![CDATA[ZuK]]></dc:creator><pubDate>Tue, 23 Aug 2005 09:23:35 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Konstruktor on Tue, 23 Aug 2005 10:34:14 GMT]]></title><description><![CDATA[<blockquote>
<p>virtuellen Kostruktor</p>
</blockquote>
<p>in C++ gibt es ihn nicht, aber bei SW Designs wird oft davon gesprochen,</p>
<p>Man kann sich aehnliches bauen ... clone methoden iss eine variante, Objectfabriken die andere ...</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/856763</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/856763</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Tue, 23 Aug 2005 10:34:14 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Konstruktor on Tue, 23 Aug 2005 11:45:23 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/3842">@RHBaum</a><br />
Viele Wege führen nach Rom... aber eine Fabrik zu implementieren um ein Objekt einfach nur zu kopieren ist ziemlich übertrieben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/856821</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/856821</guid><dc:creator><![CDATA[Mathias]]></dc:creator><pubDate>Tue, 23 Aug 2005 11:45:23 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Konstruktor on Tue, 23 Aug 2005 12:29:16 GMT]]></title><description><![CDATA[<p>keiner sagt das Objektfabriken kompliziert sein muessen ...<br />
simple Fabrik-Funktionen gehoeren immerhin auch dazu ....</p>
<p>Behaupte aber auch nich dass ers unbedingt machen sollte ...</p>
<p>sondern nur, dass er ueber diesen begriff stolpern wird sobald er nach dem begriff &quot;virtuelle Konstruktoren&quot; intensiver suchen wird ...</p>
<p>Bevor wir hier ihm ueberhaupt tips geben koennen, was und wie er implementieren sollte, fehlen uns ne menge infos noch ...</p>
<p>Weisst du, ob seine kopie von der Klasse ueberhaupt wirklich notwendig iss ??</p>
<blockquote>
<p>Ich nehme mal an, dass du das Objekt clazz kopieren/klonen möchtest.</p>
</blockquote>
<p>nee glaub er will das clazz in Classz seinen wahren typ mitbekommt ...</p>
<pre><code class="language-cpp">class ClazzA
{
public:
    virtaul ~ClazzA(){} // niemals virtuellen destruktor vergessen, wenn man was als basisklasse vorsieht 
    virtual ClazzA * clone() const = 0; 
    // Falls ClazzA nicht abstract, sondern ne default Impl sein soll, dann cannst auch so implementieren 
    virtual ClazzA * clone() const
    {
        return new ClazzA(*this); // wenn CCtor von classz A vorhanden ... geht natuerlich hier auch jeder beliebige ... 
    }
}

class ClazzB : public ClassA
{
    // CCtor mal private lassen
    ClazzB(const ClazzB &amp; rx) ... // CCtor implementieren 
public: 

    virtaul ~ClazzB(){} 
    virtual ClazzA * clone() const 
    {
        return new ClazzB(*this);
    }
}
class Clazz{
public:
    void method(const ClassA* aclazz)
    {
        // allte clazz Instanz ggf. loeschen ... oder noch besser, std::auto_ptr verwenden fuer pointer aggregationen... 
        clazz = aclazz.clone(); // hier iss nu volkommen wurscht, was aclazz in wirklichkeit ist ... 
    }
private:
  ClazzA* clazz;
}
</code></pre>
<p>Nur als so als vorschlag ....</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/856849</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/856849</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Tue, 23 Aug 2005 12:29:16 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Konstruktor on Tue, 23 Aug 2005 12:48:49 GMT]]></title><description><![CDATA[<p>Danke RHBaum,</p>
<p>wie das mit dem clonen gemeint war ist mir schon klar...<br />
Halt wie in Java nur, dass die Methode noch mit Hilfe des<br />
Copy-Konstruktor implementiert wird und public ist.</p>
<p>Gruß,<br />
CSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/856869</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/856869</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 23 Aug 2005 12:48:49 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Konstruktor on Tue, 23 Aug 2005 13:00:47 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/3842">@RHBaum</a><br />
Wenn jemand von einer Fabrik redet setze ich immer die allgemeine Definition voraus und erwarte nicht dass man damit eine vereinfachte, abgespeckte und bis zu Clone-Funktionen optimiere &quot;Fabrik&quot; meint.<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
<p>Ansonsten würde ich diese Funktionsdeklaration in ClazzB bevorzugen:</p>
<pre><code class="language-cpp">virtual ClazzB * clone() const
</code></pre>
<p>um die Clone-Funktion von ClazzA zu überschreiben... spart einem das lästige casten, wenn einem der wirkliche Datentyp ausnahmsweise mal bekannt ist...</p>
<blockquote>
<p>nee glaub er will das clazz in Classz seinen wahren typ mitbekommt ...</p>
</blockquote>
<p>*leicht verwirrt*<br />
Ok.. und ich dachte es geht hier um das Thema wie kopiere ich ein Objekt über die Schnittstelle der Oberklasse. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/856887</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/856887</guid><dc:creator><![CDATA[Mathias]]></dc:creator><pubDate>Tue, 23 Aug 2005 13:00:47 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Konstruktor on Tue, 23 Aug 2005 13:59:15 GMT]]></title><description><![CDATA[<p>Hallo Mathias,</p>
<p>du darfst doch die Signatur der Methode nicht ändern...<br />
Oder sehe ich das falsch?</p>
<p>Gruß,<br />
CSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/856953</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/856953</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 23 Aug 2005 13:59:15 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Konstruktor on Wed, 24 Aug 2005 09:04:18 GMT]]></title><description><![CDATA[<p>Die Signatur ist an dieser Stelle nicht entscheident (Die Funktion der Basisklasse besitzt so oder so eine andere Signatur als die der abgeleiteten Klasse).</p>
<p>Der Knackpunkt ist an der Stelle die Tabelle mit den virtuellen Funktionen, die für jedes Objekt gehalten wird. Solange der Rückgabetyp der abgeleiteten Klasse, die Schnittstelle es Rückgabetyps der Oberklasse besitzt, kann die Funktion der abgeleiteten Klasse in die Tabelle eingetragen werden.</p>
<p>Der in der Unterklasse verwendete Typ des Rückgabewerts ist also nicht frei gewählbar. Es kann nur der Typ verwendet werden, der in der Oberklasse verwendet wird oder Typen, die von diesem Typ abgeleitet sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/857356</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/857356</guid><dc:creator><![CDATA[Mathias]]></dc:creator><pubDate>Wed, 24 Aug 2005 09:04:18 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Konstruktor on Wed, 24 Aug 2005 09:09:33 GMT]]></title><description><![CDATA[<p>Cool...</p>
<p>Wußte ich auch noch nicht...<br />
In Java geht es jedenfalls nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Gruß,<br />
CSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/857362</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/857362</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 24 Aug 2005 09:09:33 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Konstruktor on Wed, 24 Aug 2005 09:23:01 GMT]]></title><description><![CDATA[<p>In C++ hat man mehr Möglichkeiten wie mit Java etwas zu implementieren, dafür läßt Java viele Fehler die in C++ möglich sind einfach nicht zu.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/857385</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/857385</guid><dc:creator><![CDATA[Mathias]]></dc:creator><pubDate>Wed, 24 Aug 2005 09:23:01 GMT</pubDate></item></channel></rss>