<?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[Clone Methode]]></title><description><![CDATA[<p>Ich bin in meinem Buch gerade bei Clone Methoden angelangt, das man Kopierkonstruktoren ja nicht virtuell deklarieren kann. Aber irgendwie blick ichda noch nicht so richtig durch. Hier wäre mal ein Beispiel mit einer Clone Methode:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Mammal
{
    public:
    Mammal(int Age,int Weight);
    Mammal(const Mammal &amp;rhs);
    virtual ~Mammal();
    int GetAge() const {return *itsAge;}
    int GetWeight() const {return *itsWeight;}
    virtual void Speak() const {cout &lt;&lt; &quot;Mammal spricht\n&quot;;}
    virtual Mammal* Clone() const {return new Mammal(*this);}
    private:
    int *itsAge;
    int *itsWeight;
};

Mammal::Mammal(int Age,int Weight)
:itsAge(new int(Age)),itsWeight(new int(Weight))
{

}

Mammal::Mammal(const Mammal &amp;rhs)
:itsAge(new int(rhs.GetAge())),itsWeight(new int(rhs.GetWeight()))
{
    cout &lt;&lt; &quot;Mammal Kopierkonstruktor\n&quot;;
}

Mammal::~Mammal()
{
    delete itsAge;
    delete itsWeight;
}

class Cat : public Mammal
{
    public:
    Cat(int Age,int Weight);
    Cat(const Cat &amp;rhs);
    virtual ~Cat();
    void Speak() const {cout &lt;&lt; &quot;Miau miau\n&quot;;}
    virtual Cat* Clone() const {return new Cat(*this);}
};

Cat::Cat(int Age,int Weight)
:Mammal(Age,Weight)
{

}

Cat::Cat(const Cat &amp;rhs)
:Mammal(rhs)
{
    cout &lt;&lt; &quot;Cat Kopierkonstruktor\n&quot;;
}

Cat::~Cat()
{

}

class Dog : public Mammal
{
    public:
    Dog(int Age,int Weight);
    Dog(const Dog &amp;rhs);
    virtual ~Dog();
    void Speak() const {cout &lt;&lt; &quot;Wuff wuff\n&quot;;}
    virtual Dog* Clone() const {return new Dog(*this);}
};

Dog::Dog(int Age,int Weight)
:Mammal(Age,Weight)
{

}

Dog::Dog(const Dog &amp;rhs)
:Mammal(rhs)
{
    cout &lt;&lt; &quot;Dog Kopierkonstruktor\n&quot;;
}

Dog::~Dog()
{

}

const int ANIMALS=3;

int main()
{
    int choice;
    Mammal *Tier[ANIMALS];
    Mammal *OtherTier[ANIMALS];
    Mammal *ptr;
    for (int i=0;i&lt;ANIMALS;i++)
    {
        cout &lt;&lt; &quot;Dog(1) Cat(2) Mammal(3)\n&quot;;
        cin &gt;&gt; choice;
        switch(choice)
        {
            case 1:
            ptr=new Dog(3,4);
            break;
            case 2:
            ptr=new Cat(7,4);
            break;
            case 3:
            ptr=new Mammal(1,4);
            break;
        }
        Tier[i]=ptr;
    }
    for (int i=0;i&lt;ANIMALS;i++)
    {
        Tier[i]-&gt;Speak();
        OtherTier[i]=Tier[i]-&gt;Clone();
        //OtherTier[1]=Tier[i]; //warum nicht so? Warum wird hier nicht der Kopierkonstruktor aufgerufen?
    }
    for (int i=0;i&lt;ANIMALS;i++)
    {
        cout &lt;&lt; OtherTier[i]-&gt;GetAge() &lt;&lt; &quot;\n&quot;;
    }

    return 0;
}
</code></pre>
<p>AUSGABE:</p>
<blockquote>
<p>Dog(1) Cat(2) Mammal(3)<br />
1<br />
Dog(1) Cat(2) Mammal(3)<br />
2<br />
Dog(1) Cat(2) Mammal(3)<br />
3<br />
Wuff wuff<br />
Mammal Kopierkonstruktor<br />
Dog Kopierkonstruktor<br />
Miau miau<br />
Mammal Kopierkonstruktor<br />
Cat Kopierkonstruktor<br />
Mammal spricht<br />
Mammal Kopierkonstruktor<br />
3<br />
7<br />
1</p>
</blockquote>
<p>Zeile 121 hab ich mal auskommentiert, so würde es ja auch gehen oder? Aber wenn ich es so mach, dann wird irgendwie der Kopierkonstruktor nicht aufgerufen, somit schätz ich mal das bei dem neuen Objekt die Zeiger auf die gleiche Speicherstelle verwiesen wie bei dem alten Objekt (das is ja der eigentliche Grud warum man Kopierkonstruktoren verwendet).<br />
Aber so ganz verstehe ich es noch nicht, so würde es ja auch funktionieren:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Mammal
{
    public:
    Mammal(int Age,int Weight);
    Mammal(const Mammal &amp;rhs);
    virtual ~Mammal();
    int GetAge() const {return *itsAge;}
    int GetWeight() const {return *itsWeight;}
    virtual void Speak() const {cout &lt;&lt; &quot;Mammal spricht\n&quot;;}
    virtual Mammal* Clone() const {return new Mammal(*this);}
    private:
    int *itsAge;
    int *itsWeight;
};

Mammal::Mammal(int Age,int Weight)
:itsAge(new int(Age)),itsWeight(new int(Weight))
{

}

Mammal::Mammal(const Mammal &amp;rhs)
:itsAge(new int(rhs.GetAge())),itsWeight(new int(rhs.GetWeight()))
{
    cout &lt;&lt; &quot;Mammal Kopierkonstruktor\n&quot;;
}

Mammal::~Mammal()
{
    delete itsAge;
    delete itsWeight;
}

class Cat : public Mammal
{
    public:
    Cat(int Age,int Weight);
    Cat(const Cat &amp;rhs);
    virtual ~Cat();
    void Speak() const {cout &lt;&lt; &quot;Miau miau\n&quot;;}
    virtual Cat* Clone() const {return new Cat(*this);}
};

Cat::Cat(int Age,int Weight)
:Mammal(Age,Weight)
{

}

Cat::Cat(const Cat &amp;rhs)
:Mammal(rhs)
{
    cout &lt;&lt; &quot;Cat Kopierkonstruktor\n&quot;;
}

Cat::~Cat()
{

}

class Dog : public Mammal
{
    public:
    Dog(int Age,int Weight);
    Dog(const Dog &amp;rhs);
    virtual ~Dog();
    void Speak() const {cout &lt;&lt; &quot;Wuff wuff\n&quot;;}
    virtual Dog* Clone() const {return new Dog(*this);}
};

Dog::Dog(int Age,int Weight)
:Mammal(Age,Weight)
{

}

Dog::Dog(const Dog &amp;rhs)
:Mammal(rhs)
{
    cout &lt;&lt; &quot;Dog Kopierkonstruktor\n&quot;;
}

Dog::~Dog()
{

}

const int ANIMALS=3;

int main()
{
    int choice;
    Mammal *Tier[ANIMALS];
    Mammal *OtherTier[ANIMALS];
    Mammal *ptr;
    for (int i=0;i&lt;ANIMALS;i++)
    {
        cout &lt;&lt; &quot;Dog(1) Cat(2) Mammal(3)\n&quot;;
        cin &gt;&gt; choice;
        switch(choice)
        {
            case 1:
            ptr=new Dog(3,4);
            break;
            case 2:
            ptr=new Cat(7,4);
            break;
            case 3:
            ptr=new Mammal(1,4);
            break;
        }
        Tier[i]=ptr;
    }
    for (int i=0;i&lt;ANIMALS;i++)
    {
        Tier[i]-&gt;Speak();
        //OtherTier[i]=Tier[i]-&gt;Clone();
        OtherTier[1]=Tier[i]; //&lt;-- um die Stelle hier gehts!!!!
    }
    for (int i=0;i&lt;ANIMALS;i++)
    {
        cout &lt;&lt; OtherTier[i]-&gt;GetAge() &lt;&lt; &quot;\n&quot;;
    }

    return 0;
}
</code></pre>
<p>Mh doch der schein trügt, wenn ich das ablaufen lasse und bei den Eingaben wieder 1,2 und 3 eingebe kommt zum Schluss so n Windows Fenster &quot;...musste abgebrochen werden...&quot;. Und der Kopierkonstruktor wird auch nicht aufgerufen? Mh warum kommt da ein Windows Error, nur weil ich keine Clone Methode anwende? Ich mein auch wenn der Kopierkonstruktor nicht aufgerufen wird dann müsste das Programm baer doch trotzdem laufen? Ahhhhh!!! Kann mir das mal einer erklären, weil in meinem Buch ist das nur ganz kurz beschrieben (das Buch ist teilweise echt sch**** ich rate euch kauft euch nie &quot;Jetzt lernen ich C++&quot;, aber na ja jetzt hab ichs halt und muss das beste daraus machen, war ja teuer genug <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> ).<br />
Also ich hoffe es weiß von euch jemand weiter, der mir das nochmal genau erklären kann. Dankeschön schon mal im Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/174236/clone-methode</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 14:41:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/174236.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 24 Feb 2007 12:47:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Clone Methode on Sat, 24 Feb 2007 12:47:17 GMT]]></title><description><![CDATA[<p>Ich bin in meinem Buch gerade bei Clone Methoden angelangt, das man Kopierkonstruktoren ja nicht virtuell deklarieren kann. Aber irgendwie blick ichda noch nicht so richtig durch. Hier wäre mal ein Beispiel mit einer Clone Methode:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Mammal
{
    public:
    Mammal(int Age,int Weight);
    Mammal(const Mammal &amp;rhs);
    virtual ~Mammal();
    int GetAge() const {return *itsAge;}
    int GetWeight() const {return *itsWeight;}
    virtual void Speak() const {cout &lt;&lt; &quot;Mammal spricht\n&quot;;}
    virtual Mammal* Clone() const {return new Mammal(*this);}
    private:
    int *itsAge;
    int *itsWeight;
};

Mammal::Mammal(int Age,int Weight)
:itsAge(new int(Age)),itsWeight(new int(Weight))
{

}

Mammal::Mammal(const Mammal &amp;rhs)
:itsAge(new int(rhs.GetAge())),itsWeight(new int(rhs.GetWeight()))
{
    cout &lt;&lt; &quot;Mammal Kopierkonstruktor\n&quot;;
}

Mammal::~Mammal()
{
    delete itsAge;
    delete itsWeight;
}

class Cat : public Mammal
{
    public:
    Cat(int Age,int Weight);
    Cat(const Cat &amp;rhs);
    virtual ~Cat();
    void Speak() const {cout &lt;&lt; &quot;Miau miau\n&quot;;}
    virtual Cat* Clone() const {return new Cat(*this);}
};

Cat::Cat(int Age,int Weight)
:Mammal(Age,Weight)
{

}

Cat::Cat(const Cat &amp;rhs)
:Mammal(rhs)
{
    cout &lt;&lt; &quot;Cat Kopierkonstruktor\n&quot;;
}

Cat::~Cat()
{

}

class Dog : public Mammal
{
    public:
    Dog(int Age,int Weight);
    Dog(const Dog &amp;rhs);
    virtual ~Dog();
    void Speak() const {cout &lt;&lt; &quot;Wuff wuff\n&quot;;}
    virtual Dog* Clone() const {return new Dog(*this);}
};

Dog::Dog(int Age,int Weight)
:Mammal(Age,Weight)
{

}

Dog::Dog(const Dog &amp;rhs)
:Mammal(rhs)
{
    cout &lt;&lt; &quot;Dog Kopierkonstruktor\n&quot;;
}

Dog::~Dog()
{

}

const int ANIMALS=3;

int main()
{
    int choice;
    Mammal *Tier[ANIMALS];
    Mammal *OtherTier[ANIMALS];
    Mammal *ptr;
    for (int i=0;i&lt;ANIMALS;i++)
    {
        cout &lt;&lt; &quot;Dog(1) Cat(2) Mammal(3)\n&quot;;
        cin &gt;&gt; choice;
        switch(choice)
        {
            case 1:
            ptr=new Dog(3,4);
            break;
            case 2:
            ptr=new Cat(7,4);
            break;
            case 3:
            ptr=new Mammal(1,4);
            break;
        }
        Tier[i]=ptr;
    }
    for (int i=0;i&lt;ANIMALS;i++)
    {
        Tier[i]-&gt;Speak();
        OtherTier[i]=Tier[i]-&gt;Clone();
        //OtherTier[1]=Tier[i]; //warum nicht so? Warum wird hier nicht der Kopierkonstruktor aufgerufen?
    }
    for (int i=0;i&lt;ANIMALS;i++)
    {
        cout &lt;&lt; OtherTier[i]-&gt;GetAge() &lt;&lt; &quot;\n&quot;;
    }

    return 0;
}
</code></pre>
<p>AUSGABE:</p>
<blockquote>
<p>Dog(1) Cat(2) Mammal(3)<br />
1<br />
Dog(1) Cat(2) Mammal(3)<br />
2<br />
Dog(1) Cat(2) Mammal(3)<br />
3<br />
Wuff wuff<br />
Mammal Kopierkonstruktor<br />
Dog Kopierkonstruktor<br />
Miau miau<br />
Mammal Kopierkonstruktor<br />
Cat Kopierkonstruktor<br />
Mammal spricht<br />
Mammal Kopierkonstruktor<br />
3<br />
7<br />
1</p>
</blockquote>
<p>Zeile 121 hab ich mal auskommentiert, so würde es ja auch gehen oder? Aber wenn ich es so mach, dann wird irgendwie der Kopierkonstruktor nicht aufgerufen, somit schätz ich mal das bei dem neuen Objekt die Zeiger auf die gleiche Speicherstelle verwiesen wie bei dem alten Objekt (das is ja der eigentliche Grud warum man Kopierkonstruktoren verwendet).<br />
Aber so ganz verstehe ich es noch nicht, so würde es ja auch funktionieren:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Mammal
{
    public:
    Mammal(int Age,int Weight);
    Mammal(const Mammal &amp;rhs);
    virtual ~Mammal();
    int GetAge() const {return *itsAge;}
    int GetWeight() const {return *itsWeight;}
    virtual void Speak() const {cout &lt;&lt; &quot;Mammal spricht\n&quot;;}
    virtual Mammal* Clone() const {return new Mammal(*this);}
    private:
    int *itsAge;
    int *itsWeight;
};

Mammal::Mammal(int Age,int Weight)
:itsAge(new int(Age)),itsWeight(new int(Weight))
{

}

Mammal::Mammal(const Mammal &amp;rhs)
:itsAge(new int(rhs.GetAge())),itsWeight(new int(rhs.GetWeight()))
{
    cout &lt;&lt; &quot;Mammal Kopierkonstruktor\n&quot;;
}

Mammal::~Mammal()
{
    delete itsAge;
    delete itsWeight;
}

class Cat : public Mammal
{
    public:
    Cat(int Age,int Weight);
    Cat(const Cat &amp;rhs);
    virtual ~Cat();
    void Speak() const {cout &lt;&lt; &quot;Miau miau\n&quot;;}
    virtual Cat* Clone() const {return new Cat(*this);}
};

Cat::Cat(int Age,int Weight)
:Mammal(Age,Weight)
{

}

Cat::Cat(const Cat &amp;rhs)
:Mammal(rhs)
{
    cout &lt;&lt; &quot;Cat Kopierkonstruktor\n&quot;;
}

Cat::~Cat()
{

}

class Dog : public Mammal
{
    public:
    Dog(int Age,int Weight);
    Dog(const Dog &amp;rhs);
    virtual ~Dog();
    void Speak() const {cout &lt;&lt; &quot;Wuff wuff\n&quot;;}
    virtual Dog* Clone() const {return new Dog(*this);}
};

Dog::Dog(int Age,int Weight)
:Mammal(Age,Weight)
{

}

Dog::Dog(const Dog &amp;rhs)
:Mammal(rhs)
{
    cout &lt;&lt; &quot;Dog Kopierkonstruktor\n&quot;;
}

Dog::~Dog()
{

}

const int ANIMALS=3;

int main()
{
    int choice;
    Mammal *Tier[ANIMALS];
    Mammal *OtherTier[ANIMALS];
    Mammal *ptr;
    for (int i=0;i&lt;ANIMALS;i++)
    {
        cout &lt;&lt; &quot;Dog(1) Cat(2) Mammal(3)\n&quot;;
        cin &gt;&gt; choice;
        switch(choice)
        {
            case 1:
            ptr=new Dog(3,4);
            break;
            case 2:
            ptr=new Cat(7,4);
            break;
            case 3:
            ptr=new Mammal(1,4);
            break;
        }
        Tier[i]=ptr;
    }
    for (int i=0;i&lt;ANIMALS;i++)
    {
        Tier[i]-&gt;Speak();
        //OtherTier[i]=Tier[i]-&gt;Clone();
        OtherTier[1]=Tier[i]; //&lt;-- um die Stelle hier gehts!!!!
    }
    for (int i=0;i&lt;ANIMALS;i++)
    {
        cout &lt;&lt; OtherTier[i]-&gt;GetAge() &lt;&lt; &quot;\n&quot;;
    }

    return 0;
}
</code></pre>
<p>Mh doch der schein trügt, wenn ich das ablaufen lasse und bei den Eingaben wieder 1,2 und 3 eingebe kommt zum Schluss so n Windows Fenster &quot;...musste abgebrochen werden...&quot;. Und der Kopierkonstruktor wird auch nicht aufgerufen? Mh warum kommt da ein Windows Error, nur weil ich keine Clone Methode anwende? Ich mein auch wenn der Kopierkonstruktor nicht aufgerufen wird dann müsste das Programm baer doch trotzdem laufen? Ahhhhh!!! Kann mir das mal einer erklären, weil in meinem Buch ist das nur ganz kurz beschrieben (das Buch ist teilweise echt sch**** ich rate euch kauft euch nie &quot;Jetzt lernen ich C++&quot;, aber na ja jetzt hab ichs halt und muss das beste daraus machen, war ja teuer genug <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> ).<br />
Also ich hoffe es weiß von euch jemand weiter, der mir das nochmal genau erklären kann. Dankeschön schon mal im Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1234613</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1234613</guid><dc:creator><![CDATA[Stromberg]]></dc:creator><pubDate>Sat, 24 Feb 2007 12:47:17 GMT</pubDate></item><item><title><![CDATA[Reply to Clone Methode on Sat, 24 Feb 2007 13:02:44 GMT]]></title><description><![CDATA[<p>Der Zugriffsfehler ist wegen</p>
<pre><code>OtherTier&lsqb;&lsqb;b]1[/b&rsqb;&rsqb;=Tier[i]; //&lt;-- um die Stelle hier gehts!!!!
</code></pre>
<p>sollte wohl ein i sein.<br />
Kurt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1234622</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1234622</guid><dc:creator><![CDATA[ZuK]]></dc:creator><pubDate>Sat, 24 Feb 2007 13:02:44 GMT</pubDate></item><item><title><![CDATA[Reply to Clone Methode on Sat, 24 Feb 2007 13:28:05 GMT]]></title><description><![CDATA[<p>Oh äh peinlich, peinlich :D, aber ich verstehe immer noch nicht warum kein Kopierkonstruktor aufgerufen wird, die Ausgabe wäre dann:</p>
<pre><code class="language-cpp">Dog(1) Cat(2) Mammal(3)
1
Dog(1) Cat(2) Mammal(3)
2
Dog(1) Cat(2) Mammal(3)
3
Wuff wuff
Miau miau
Mammal spricht
3
7
1
</code></pre>
<p>Also macht der nur eine flache Kopie oder? Also verweisen &quot;altes Objekt&quot; und &quot;neues Objekt&quot; auf die gleiche Speicherstelle im Heap? Deshalb die Clone Methode oder was sollte sonst der Sinn einer Clone Mttohde sein? Also Clone Methode vs. Kopierkonstruktor würde ich mal sagen. Na ja wer mehr weiß als ich soll es mir doch bitte erklären. Dankeschön schon mal im Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1234637</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1234637</guid><dc:creator><![CDATA[Stromberg]]></dc:creator><pubDate>Sat, 24 Feb 2007 13:28:05 GMT</pubDate></item><item><title><![CDATA[Reply to Clone Methode on Sat, 24 Feb 2007 13:54:22 GMT]]></title><description><![CDATA[<p>In deinem Beispiel kopierst du keine Objekte, nur Pointer, daher wird auch kein Kopierkonstruktor deiner Klassen aufgerufen. Auch wenns Objekte wären, würde nicht der Kopierkonstruktor aufgerufen werden sondern der Zuweisungs Operator.<br />
Kurt<br />
Edit:<br />
Denke du willst sowas</p>
<pre><code class="language-cpp">for (int i=0;i&lt;ANIMALS;i++)
    {
        Tier[i]-&gt;Speak();
        OtherTier[i]=Tier[i]-&gt;Clone();
    }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1234642</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1234642</guid><dc:creator><![CDATA[ZuK]]></dc:creator><pubDate>Sat, 24 Feb 2007 13:54:22 GMT</pubDate></item><item><title><![CDATA[Reply to Clone Methode on Sat, 24 Feb 2007 14:02:58 GMT]]></title><description><![CDATA[<p>Ja aber ich verstehe nicht wo hier der Unterschied ist:<br />
<strong>1.</strong></p>
<pre><code class="language-cpp">#include &lt;iostream&gt; 
using namespace std; 

class Mammal 
{ 
    public: 
    Mammal(int Age,int Weight); 
    Mammal(const Mammal &amp;rhs); 
    virtual ~Mammal(); 
    int GetAge() const {return *itsAge;} 
    int GetWeight() const {return *itsWeight;} 
    virtual void Speak() const {cout &lt;&lt; &quot;Mammal spricht\n&quot;;} 
    virtual Mammal* Clone() const {return new Mammal(*this);} 
    private: 
    int *itsAge; 
    int *itsWeight; 
}; 

Mammal::Mammal(int Age,int Weight) 
:itsAge(new int(Age)),itsWeight(new int(Weight)) 
{ 

} 

Mammal::Mammal(const Mammal &amp;rhs) 
:itsAge(new int(rhs.GetAge())),itsWeight(new int(rhs.GetWeight())) 
{ 
    cout &lt;&lt; &quot;Mammal Kopierkonstruktor\n&quot;; 
} 

Mammal::~Mammal() 
{ 
    delete itsAge; 
    delete itsWeight; 
} 

class Cat : public Mammal 
{ 
    public: 
    Cat(int Age,int Weight); 
    Cat(const Cat &amp;rhs); 
    virtual ~Cat(); 
    void Speak() const {cout &lt;&lt; &quot;Miau miau\n&quot;;} 
    virtual Cat* Clone() const {return new Cat(*this);} 
}; 

Cat::Cat(int Age,int Weight) 
:Mammal(Age,Weight) 
{ 

} 

Cat::Cat(const Cat &amp;rhs) 
:Mammal(rhs) 
{ 
    cout &lt;&lt; &quot;Cat Kopierkonstruktor\n&quot;; 
} 

Cat::~Cat() 
{ 

} 

class Dog : public Mammal 
{ 
    public: 
    Dog(int Age,int Weight); 
    Dog(const Dog &amp;rhs); 
    virtual ~Dog(); 
    void Speak() const {cout &lt;&lt; &quot;Wuff wuff\n&quot;;} 
    virtual Dog* Clone() const {return new Dog(*this);} 
}; 

Dog::Dog(int Age,int Weight) 
:Mammal(Age,Weight) 
{ 

} 

Dog::Dog(const Dog &amp;rhs) 
:Mammal(rhs) 
{ 
    cout &lt;&lt; &quot;Dog Kopierkonstruktor\n&quot;; 
} 

Dog::~Dog() 
{ 

} 

const int ANIMALS=3; 

int main() 
{ 
    int choice; 
    Mammal *Tier[ANIMALS]; 
    Mammal *OtherTier[ANIMALS]; 
    Mammal *ptr; 
    for (int i=0;i&lt;ANIMALS;i++) 
    { 
        cout &lt;&lt; &quot;Dog(1) Cat(2) Mammal(3)\n&quot;; 
        cin &gt;&gt; choice; 
        switch(choice) 
        { 
            case 1: 
            ptr=new Dog(3,4); 
            break; 
            case 2: 
            ptr=new Cat(7,4); 
            break; 
            case 3: 
            ptr=new Mammal(1,4); 
            break; 
        } 
        Tier[i]=ptr; 
    } 
    for (int i=0;i&lt;ANIMALS;i++) 
    { 
        Tier[i]-&gt;Speak(); 
        OtherTier[i]=Tier[i]-&gt;Clone(); //&lt;--
    } 
    for (int i=0;i&lt;ANIMALS;i++) 
    { 
        cout &lt;&lt; OtherTier[i]-&gt;GetAge() &lt;&lt; &quot;\n&quot;; 
    } 

    return 0; 
}
</code></pre>
<p>oder so<br />
<strong>2.</strong></p>
<pre><code class="language-cpp">#include &lt;iostream&gt; 
using namespace std; 

class Mammal 
{ 
    public: 
    Mammal(int Age,int Weight); 
    Mammal(const Mammal &amp;rhs); 
    virtual ~Mammal(); 
    int GetAge() const {return *itsAge;} 
    int GetWeight() const {return *itsWeight;} 
    virtual void Speak() const {cout &lt;&lt; &quot;Mammal spricht\n&quot;;} 
    virtual Mammal* Clone() const {return new Mammal(*this);} 
    private: 
    int *itsAge; 
    int *itsWeight; 
}; 

Mammal::Mammal(int Age,int Weight) 
:itsAge(new int(Age)),itsWeight(new int(Weight)) 
{ 

} 

Mammal::Mammal(const Mammal &amp;rhs) 
:itsAge(new int(rhs.GetAge())),itsWeight(new int(rhs.GetWeight())) 
{ 
    cout &lt;&lt; &quot;Mammal Kopierkonstruktor\n&quot;; 
} 

Mammal::~Mammal() 
{ 
    delete itsAge; 
    delete itsWeight; 
} 

class Cat : public Mammal 
{ 
    public: 
    Cat(int Age,int Weight); 
    Cat(const Cat &amp;rhs); 
    virtual ~Cat(); 
    void Speak() const {cout &lt;&lt; &quot;Miau miau\n&quot;;} 
    virtual Cat* Clone() const {return new Cat(*this);} 
}; 

Cat::Cat(int Age,int Weight) 
:Mammal(Age,Weight) 
{ 

} 

Cat::Cat(const Cat &amp;rhs) 
:Mammal(rhs) 
{ 
    cout &lt;&lt; &quot;Cat Kopierkonstruktor\n&quot;; 
} 

Cat::~Cat() 
{ 

} 

class Dog : public Mammal 
{ 
    public: 
    Dog(int Age,int Weight); 
    Dog(const Dog &amp;rhs); 
    virtual ~Dog(); 
    void Speak() const {cout &lt;&lt; &quot;Wuff wuff\n&quot;;} 
    virtual Dog* Clone() const {return new Dog(*this);} 
}; 

Dog::Dog(int Age,int Weight) 
:Mammal(Age,Weight) 
{ 

} 

Dog::Dog(const Dog &amp;rhs) 
:Mammal(rhs) 
{ 
    cout &lt;&lt; &quot;Dog Kopierkonstruktor\n&quot;; 
} 

Dog::~Dog() 
{ 

} 

const int ANIMALS=3; 

int main() 
{ 
    int choice; 
    Mammal *Tier[ANIMALS]; 
    Mammal *OtherTier[ANIMALS]; 
    Mammal *ptr; 
    for (int i=0;i&lt;ANIMALS;i++) 
    { 
        cout &lt;&lt; &quot;Dog(1) Cat(2) Mammal(3)\n&quot;; 
        cin &gt;&gt; choice; 
        switch(choice) 
        { 
            case 1: 
            ptr=new Dog(3,4); 
            break; 
            case 2: 
            ptr=new Cat(7,4); 
            break; 
            case 3: 
            ptr=new Mammal(1,4); 
            break; 
        } 
        Tier[i]=ptr; 
    } 
    for (int i=0;i&lt;ANIMALS;i++) 
    { 
        Tier[i]-&gt;Speak(); 
        OtherTier[i]=Tier[i];  //&lt;--
    } 
    for (int i=0;i&lt;ANIMALS;i++) 
    { 
        cout &lt;&lt; OtherTier[i]-&gt;GetAge() &lt;&lt; &quot;\n&quot;; 
    } 

    return 0; 
}
</code></pre>
<p>Bei &quot;1.&quot; übergebe ich doch immer ein abgeleitetes Objekt von Mammal, oder das Mammal Objekt (immer als Zeiger), und bei &quot;2.&quot; übergebe ich doch einfach das gesamte Mammal Objekt, bzw. die Adresse? Warum qird aber bei &quot;1.&quot; der Kopierkonstruktor aufgerufen und bei &quot;2.&quot; nicht? Dankeschön schon mal im Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1234652</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1234652</guid><dc:creator><![CDATA[Stromberg]]></dc:creator><pubDate>Sat, 24 Feb 2007 14:02:58 GMT</pubDate></item><item><title><![CDATA[Reply to Clone Methode on Sat, 24 Feb 2007 14:10:49 GMT]]></title><description><![CDATA[<p>Bei 1 erzeugst du mit Clone() ein neues Objekt ( eine Kopie ). Du hast jetzt also 6 Pointer auf verschiedene Objekte.<br />
Bei 2 weist du nur einem Pointer einen Pointer auf ein anderes Objekt zu. In beiden Arrays hast du jetzt die gleichen Pointer also nur 3 verschiedene Pointer.<br />
Kurt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1234654</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1234654</guid><dc:creator><![CDATA[ZuK]]></dc:creator><pubDate>Sat, 24 Feb 2007 14:10:49 GMT</pubDate></item></channel></rss>