<?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[virtual copy constructors]]></title><description><![CDATA[<p>Ich beziehe mich hier auf Item 25 aus More Efficient C++ von Scott Meyers.</p>
<p>Im Folgenden Konstrukt wird ein Beispiel vorgestellt, bei dem eine Abstrakte Klasse eine clone Funktion definiert, die in den abgeleiteten Klassen eine Kopie der aktuellen Instanz über den Copy Konstruktor zurückliefert:</p>
<pre><code class="language-cpp">class NewsletterComponent{
public:
    // declaration of virtual copy constructor
    virtual NewsletterComponent * clone() const = 0;
};

class TextBlock: public NewsletterComponent {
public:
    virtual TextBlock * clone() const
    {   return new TextBlock(*this); }
};

class Graphic: public NewsletterComponent {
public:
    virtual Graphic * clone() const
    {   return new Graphic(*this); }
};
</code></pre>
<p>das die clone Funktionen andere Rückgabetypen haben können ist verwirrend, aber scheint C++ nichts auszumachen.</p>
<p>Was mich aber irritiert ist der folgende Code, da wird über eine Liste von 'NewsletterComponent' die 'TextBlock' und 'Graphic' Instanzen kopiert:</p>
<pre><code class="language-cpp">class Newsletter {
public: 
    Newsletter (const Newsletter &amp; ths);
private:
    list&lt;NewsletterComponent*&gt; components:
};

Newsletter::Newsletter (const Newsletter &amp; ths)
{
    for(list&lt;NewsletterComponent*&gt;::const_iterator it = rhs.components.begin(); 
        it != rhs.components.end(); ++it) 
    {
        components.push_back((*it)-&gt;clone());
    }
}
</code></pre>
<p>Hier tauchen ein paar Verständnisfragen auf:</p>
<p>1. Warum kann ich Pointer auf NewsletterComponent als Typ angeben aber stattdessen ebenfalls davon abgeleitet Klassen speichern.</p>
<p>2. Woher weiß die clone() Funktion von NewsletterComponent auf welche abgeleitete KLasse sie sich bezieht? Oder geht das nur weil eigentlich immer ein Pointer auf TextBlock oder Graphic gespeichert wurde?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/234760/virtual-copy-constructors</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 08:25:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/234760.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 22 Feb 2009 09:23:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to virtual copy constructors on Sun, 22 Feb 2009 09:23:19 GMT]]></title><description><![CDATA[<p>Ich beziehe mich hier auf Item 25 aus More Efficient C++ von Scott Meyers.</p>
<p>Im Folgenden Konstrukt wird ein Beispiel vorgestellt, bei dem eine Abstrakte Klasse eine clone Funktion definiert, die in den abgeleiteten Klassen eine Kopie der aktuellen Instanz über den Copy Konstruktor zurückliefert:</p>
<pre><code class="language-cpp">class NewsletterComponent{
public:
    // declaration of virtual copy constructor
    virtual NewsletterComponent * clone() const = 0;
};

class TextBlock: public NewsletterComponent {
public:
    virtual TextBlock * clone() const
    {   return new TextBlock(*this); }
};

class Graphic: public NewsletterComponent {
public:
    virtual Graphic * clone() const
    {   return new Graphic(*this); }
};
</code></pre>
<p>das die clone Funktionen andere Rückgabetypen haben können ist verwirrend, aber scheint C++ nichts auszumachen.</p>
<p>Was mich aber irritiert ist der folgende Code, da wird über eine Liste von 'NewsletterComponent' die 'TextBlock' und 'Graphic' Instanzen kopiert:</p>
<pre><code class="language-cpp">class Newsletter {
public: 
    Newsletter (const Newsletter &amp; ths);
private:
    list&lt;NewsletterComponent*&gt; components:
};

Newsletter::Newsletter (const Newsletter &amp; ths)
{
    for(list&lt;NewsletterComponent*&gt;::const_iterator it = rhs.components.begin(); 
        it != rhs.components.end(); ++it) 
    {
        components.push_back((*it)-&gt;clone());
    }
}
</code></pre>
<p>Hier tauchen ein paar Verständnisfragen auf:</p>
<p>1. Warum kann ich Pointer auf NewsletterComponent als Typ angeben aber stattdessen ebenfalls davon abgeleitet Klassen speichern.</p>
<p>2. Woher weiß die clone() Funktion von NewsletterComponent auf welche abgeleitete KLasse sie sich bezieht? Oder geht das nur weil eigentlich immer ein Pointer auf TextBlock oder Graphic gespeichert wurde?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1667893</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1667893</guid><dc:creator><![CDATA[pospiech]]></dc:creator><pubDate>Sun, 22 Feb 2009 09:23:19 GMT</pubDate></item><item><title><![CDATA[Reply to virtual copy constructors on Sun, 22 Feb 2009 09:37:35 GMT]]></title><description><![CDATA[<p>1. Das nennt sich Kovarianz:<br />
<a href="http://de.wikipedia.org/wiki/Kovarianz_(Informatik)" rel="nofollow">http://de.wikipedia.org/wiki/Kovarianz_(Informatik)</a></p>
<p>2. Das wird zur Laufzeit ermittelt, weil die Methoden virtuell sind.<br />
<a href="http://de.wikipedia.org/wiki/Polymorphie_(Programmierung)" rel="nofollow">http://de.wikipedia.org/wiki/Polymorphie_(Programmierung)</a></p>
<p>Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1667904</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1667904</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Sun, 22 Feb 2009 09:37:35 GMT</pubDate></item></channel></rss>