<?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[Methode aus Basisklasse aufrufen.]]></title><description><![CDATA[<p>Kann mir jemand sagen wie ich mit dem Objekt &quot;hans&quot; die Methode &quot;get_m1&quot; aufrufen kann? Hab grad eine kleine Verwirrung.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Computer
{
    public:
    Computer(int a_, int b_);
    Computer(const Computer &amp;rhs);
    virtual ~Computer();
    inline int get_a() const {return *m_a;}
    inline int get_b() const {return *m_b;}
    virtual Computer * Clone() const {return new Computer(*this);}

    private:
    int *m_a, *m_b;
};

Computer::Computer(int a_, int b_)
{
    m_a=new int(a_);
    m_b=new int(b_);
}

Computer::Computer(const Computer &amp;rhs)
{
    m_a=new int(rhs.get_a());
    m_b=new int(rhs.get_b());

}

Computer::~Computer()
{
    delete m_a, m_b;
}

class Rating1 : public Computer
{
    public:
    Rating1(int a_, int b_, int m1_, int m2_);
    Rating1(const Rating1 &amp;rhs);
    ~Rating1();
    inline int get_m1() const {return *m_m1;}
    inline int get_m2() const {return *m_m2;}
    Rating1 * Clone() const {return new Rating1(*this);}

    private:
    int *m_m1, *m_m2;
};

Rating1::Rating1(int a_, int b_, int m1_, int m2_)
:Computer(a_,b_)
{
    m_m1=new int(m1_);
    m_m2=new int(m2_);
}

Rating1::Rating1(const Rating1 &amp;rhs)
:Computer(rhs)
{
    m_m1=new int(rhs.get_m1());
    m_m2=new int(rhs.get_m2());
}

Rating1::~Rating1()
{
    delete m_m1, m_m2;
}

int main()
{
    Computer *hans=new Rating1(18,37,23,41);

    return 0;
}
</code></pre>
<p>MfG<br />
Stromberg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/191247/methode-aus-basisklasse-aufrufen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 22:43:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/191247.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 31 Aug 2007 17:20:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Methode aus Basisklasse aufrufen. on Fri, 31 Aug 2007 17:20:34 GMT]]></title><description><![CDATA[<p>Kann mir jemand sagen wie ich mit dem Objekt &quot;hans&quot; die Methode &quot;get_m1&quot; aufrufen kann? Hab grad eine kleine Verwirrung.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Computer
{
    public:
    Computer(int a_, int b_);
    Computer(const Computer &amp;rhs);
    virtual ~Computer();
    inline int get_a() const {return *m_a;}
    inline int get_b() const {return *m_b;}
    virtual Computer * Clone() const {return new Computer(*this);}

    private:
    int *m_a, *m_b;
};

Computer::Computer(int a_, int b_)
{
    m_a=new int(a_);
    m_b=new int(b_);
}

Computer::Computer(const Computer &amp;rhs)
{
    m_a=new int(rhs.get_a());
    m_b=new int(rhs.get_b());

}

Computer::~Computer()
{
    delete m_a, m_b;
}

class Rating1 : public Computer
{
    public:
    Rating1(int a_, int b_, int m1_, int m2_);
    Rating1(const Rating1 &amp;rhs);
    ~Rating1();
    inline int get_m1() const {return *m_m1;}
    inline int get_m2() const {return *m_m2;}
    Rating1 * Clone() const {return new Rating1(*this);}

    private:
    int *m_m1, *m_m2;
};

Rating1::Rating1(int a_, int b_, int m1_, int m2_)
:Computer(a_,b_)
{
    m_m1=new int(m1_);
    m_m2=new int(m2_);
}

Rating1::Rating1(const Rating1 &amp;rhs)
:Computer(rhs)
{
    m_m1=new int(rhs.get_m1());
    m_m2=new int(rhs.get_m2());
}

Rating1::~Rating1()
{
    delete m_m1, m_m2;
}

int main()
{
    Computer *hans=new Rating1(18,37,23,41);

    return 0;
}
</code></pre>
<p>MfG<br />
Stromberg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1356307</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356307</guid><dc:creator><![CDATA[Stromberg]]></dc:creator><pubDate>Fri, 31 Aug 2007 17:20:34 GMT</pubDate></item><item><title><![CDATA[Reply to Methode aus Basisklasse aufrufen. on Fri, 31 Aug 2007 17:26:30 GMT]]></title><description><![CDATA[<p>nur indem Du mit dynamic_cast in die abgeleitete Klasse castest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1356311</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356311</guid><dc:creator><![CDATA[Airdamn]]></dc:creator><pubDate>Fri, 31 Aug 2007 17:26:30 GMT</pubDate></item><item><title><![CDATA[Reply to Methode aus Basisklasse aufrufen. on Fri, 31 Aug 2007 17:27:44 GMT]]></title><description><![CDATA[<p>Down-cast auf Rating1.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1356312</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356312</guid><dc:creator><![CDATA[this-*gt*that]]></dc:creator><pubDate>Fri, 31 Aug 2007 17:27:44 GMT</pubDate></item><item><title><![CDATA[Reply to Methode aus Basisklasse aufrufen. on Fri, 31 Aug 2007 17:31:11 GMT]]></title><description><![CDATA[<p>Äh und wie mach ich das, kann mir jemand ein Beispiel machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1356315</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356315</guid><dc:creator><![CDATA[Stromberg]]></dc:creator><pubDate>Fri, 31 Aug 2007 17:31:11 GMT</pubDate></item><item><title><![CDATA[Reply to Methode aus Basisklasse aufrufen. on Fri, 31 Aug 2007 17:39:56 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">int main()
{
    Computer *hans=new Rating1(18,37,23,41);
    Rating1 *p = dynamic_cast&lt;Rating1*&gt;(hans);
    int m1 = p-&gt;get_m1();

    delete hans;
    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1356321</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356321</guid><dc:creator><![CDATA[Airdamn]]></dc:creator><pubDate>Fri, 31 Aug 2007 17:39:56 GMT</pubDate></item><item><title><![CDATA[Reply to Methode aus Basisklasse aufrufen. on Fri, 31 Aug 2007 20:36:02 GMT]]></title><description><![CDATA[<p>Hab noch zwei Fragen zu meiner Klasse:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Computer
{
    public:
    Computer(int a_, int b_);
    Computer(const Computer &amp;rhs);
    virtual ~Computer();
    inline int get_a() const {return *m_a;}
    inline int get_b() const {return *m_b;}
    virtual Computer * Clone() const {return new Computer(*this);}
    virtual inline int get_m1() const {return 0;}
    virtual inline int get_m2() const {return 0;}

    private:
    int *m_a, *m_b;
};

Computer::Computer(int a_, int b_)
{
    m_a=new int(a_);
    m_b=new int(b_);
}

Computer::Computer(const Computer &amp;rhs)
{
    m_a=new int(rhs.get_a());
    m_b=new int(rhs.get_b());

}

Computer::~Computer()
{
    delete m_a, m_b;
}

class Rating1 : public Computer
{
    public:
    Rating1(int a_, int b_, int m1_, int m2_);
    Rating1(const Rating1 &amp;rhs);
    ~Rating1();
    inline int get_m1() const {return *m_m1;}
    inline int get_m2() const {return *m_m2;}
    Rating1 * Clone() const {return new Rating1(*this);}

    private:
    int *m_m1, *m_m2;
};

Rating1::Rating1(int a_, int b_, int m1_, int m2_)
:Computer(a_,b_)
{
    m_m1=new int(m1_);
    m_m2=new int(m2_);
}

Rating1::Rating1(const Rating1 &amp;rhs)
:Computer(rhs)
{
    m_m1=new int(rhs.get_m1());
    m_m2=new int(rhs.get_m2());
}

Rating1::~Rating1()
{
    delete m_m1, m_m2;
}

int main()
{
    Computer *hans=new Rating1(18,37,23,41);
    cout &lt;&lt; &quot;BASIS KLASSE: &quot; &lt;&lt; hans-&gt;get_a() &lt;&lt; &quot; &quot; &lt;&lt; hans-&gt;get_b() &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;ABGELEITETE KLASSE: &quot; &lt;&lt; hans-&gt;get_m1() &lt;&lt; &quot; &quot; &lt;&lt; hans-&gt;get_m2() &lt;&lt; &quot;\n\n&quot;;
    Computer *werner=new Rating1(33,44,2,3);
    cout &lt;&lt; &quot;BASIS KLASSE: &quot; &lt;&lt; werner-&gt;get_a() &lt;&lt; &quot; &quot; &lt;&lt; werner-&gt;get_b() &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;ABGELEITETE KLASSE: &quot; &lt;&lt; werner-&gt;get_m1() &lt;&lt; &quot; &quot; &lt;&lt; werner-&gt;get_m2() &lt;&lt; &quot;\n\n&quot;;
    werner=hans-&gt;Clone();
    cout &lt;&lt; &quot;BASIS KLASSE: &quot; &lt;&lt; werner-&gt;get_a() &lt;&lt; &quot; &quot; &lt;&lt; werner-&gt;get_b() &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;ABGELEITETE KLASSE: &quot; &lt;&lt; werner-&gt;get_m1() &lt;&lt; &quot; &quot; &lt;&lt; werner-&gt;get_m2() &lt;&lt; &quot;\n\n&quot;;

    delete hans, werner;

    return 0;
}
</code></pre>
<p><strong>1.</strong><br />
Das was ich in &quot;main&quot; mache, Zeile 84, dem Objekt sein &quot;Rating1&quot; Teil raußreisen, und es durch eine Kopie von &quot;Rating1&quot; aus dem Objekt &quot;hans&quot; ersetze, ist das korrekt oder gibts da irgendwo Speicherverletzungen?</p>
<p><strong>2.</strong><br />
Warum kann ich in Zeile 84 anstatt:</p>
<pre><code class="language-cpp">werner=hans-&gt;Clone();
</code></pre>
<p>nicht:</p>
<pre><code class="language-cpp">werner(hans-&gt;Clone());
</code></pre>
<p>machen? Wenn ichs so mache kommt eine Fehlermeldung:</p>
<blockquote>
<p>Compiling: C:\MinGW\Andi\buch.cpp<br />
C:\MinGW\Andi\buch.cpp: In function <code>int main()': C:\\MinGW\\Andi\\buch.cpp:84: error:</code>werner' cannot be used as a function<br />
Process terminated with status 1 (0 minutes, 0 seconds)<br />
1 errors, 0 warnings</p>
</blockquote>
<p>Dankeschön schon mal im Voraus.<br />
Stromberg</p>
<p>PS: (Wenn sich jemand aufregt :D) Ich hab keinen dynamic cast verwendet, weil das erst in meinem Buch im nächsten Kapitel vorkommt. Aber in dem Kapitel bin ich leider noch net.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1356463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356463</guid><dc:creator><![CDATA[Stromberg]]></dc:creator><pubDate>Fri, 31 Aug 2007 20:36:02 GMT</pubDate></item><item><title><![CDATA[Reply to Methode aus Basisklasse aufrufen. on Fri, 31 Aug 2007 21:22:02 GMT]]></title><description><![CDATA[<p>Stromberg schrieb:</p>
<blockquote>
<p>Das was ich in &quot;main&quot; mache, Zeile 84, dem Objekt sein &quot;Rating1&quot; Teil raußreisen, und es durch eine Kopie von &quot;Rating1&quot; aus dem Objekt &quot;hans&quot; ersetze, ist das korrekt oder gibts da irgendwo Speicherverletzungen?</p>
</blockquote>
<p>Das nicht, aber ein Speicherleck gibt's, da du das alte Rating1-Objekt nie freigibst. Du solltest dir entweder std::auto_ptr ansehen (das kann aber warten) oder du löschst das Objekt anständig, bevor du den Zeiger überschreibst. C++ hat von Haus aus keinen Müllschlucker.</p>
<p>Stromberg schrieb:</p>
<blockquote>
<p>Warum kann ich in Zeile 84 anstatt:</p>
<pre><code class="language-cpp">werner=hans-&gt;Clone();
</code></pre>
<p>nicht:</p>
<pre><code class="language-cpp">werner(hans-&gt;Clone());
</code></pre>
<p>machen?</p>
</blockquote>
<p>Weil es nicht dasselbe ist. Ersteres ist eine Zuweisung, letzteres eine Funktionsanwendung. Da „werner“ aber weder eine Funktion noch ein Funktionszeiger noch ein Funktor ist bekommst du einen Fehler.</p>
<p>Du verwechselst hier mit einem Konstruktoraufruf (der ja beide Formen haben kann, aber etwas völlig anderes ist!) und Zuweisung.</p>
<p>Stromberg schrieb:</p>
<blockquote>
<pre><code class="language-cpp">delete hans, werner;
</code></pre>
</blockquote>
<p>Ich bin mir nicht ganz sicher, aber wenn ich Recht habe ist das dein zweites Speicherleck in diesem Programm, da „hans“ nicht freigegeben wird.</p>
<p>Der Grund dass das nicht so ist ist, dass das Standardverhalten des Kommaoperators ist, alle Ausdrücke auszuwerten, aber nur den letzten zurückzugeben. Das heißt, hier wird genau einmal der Speicher freigegeben.</p>
<p>Generell solltest du dir mehr Gedanken darüber machen, welcher Zeiger worauf zeigt. Du siehst ja, mit wie wenig Code man Speicherlecks produzieren kann. (Und keine Sorge, später wirst du das auch automatisieren können ;))</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1356488</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356488</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Fri, 31 Aug 2007 21:22:02 GMT</pubDate></item><item><title><![CDATA[Reply to Methode aus Basisklasse aufrufen. on Fri, 31 Aug 2007 21:01:21 GMT]]></title><description><![CDATA[<p>Du brauchst auch einen richtigen Copy-Konstruktor und op=, weil die Member (int-pointer) sonst bei mehreren Objekten auf das gleiche zeigen. Beim delete krachts dann, weil mehrmals versucht wird den gleichen Speicher freizugeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1356491</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356491</guid><dc:creator><![CDATA[Airdamn]]></dc:creator><pubDate>Fri, 31 Aug 2007 21:01:21 GMT</pubDate></item><item><title><![CDATA[Reply to Methode aus Basisklasse aufrufen. on Fri, 31 Aug 2007 22:07:38 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/8113">@Airdamn</a><br />
Ich kann dir nicht ganz folgen, ich hab doch Kopierkonstruktoren, und diese schaune doch auch extra drau das neuer Speicher reserviert word, und sich keine zwei Objekte eine Adresse teilen....oder was meinst du?</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9606">@.filmor</a><br />
Tut mir leid, aber ich verstehe nicht so ganz, meinst du das man nicht:</p>
<pre><code class="language-cpp">delete hans, werner;
</code></pre>
<p>schreiben sollte, sondern:</p>
<pre><code class="language-cpp">delete hans;
delete werner;
</code></pre>
<p>?</p>
<p>EDIT: Den letzteren Teil hab ich shcon wieder gelöscht, weil das hab ich jetzt schon wieder verstanden, war unsinn was ich da geschrieben habe...:D</p>
<p>Dankeschön schon mal im Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1356500</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356500</guid><dc:creator><![CDATA[Stromberg]]></dc:creator><pubDate>Fri, 31 Aug 2007 22:07:38 GMT</pubDate></item><item><title><![CDATA[Reply to Methode aus Basisklasse aufrufen. on Fri, 31 Aug 2007 22:19:23 GMT]]></title><description><![CDATA[<p>Äh und noch was kurz, hier mal noch der Code, mit der Erweiterung das die Kopierkonstruktor sich jetzt melden wenn se eingesetzte werden:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Computer
{
    public:
    Computer(int a_, int b_);
    Computer(const Computer &amp;rhs);
    virtual ~Computer();
    inline int get_a() const {return *m_a;}
    inline int get_b() const {return *m_b;}
    virtual Computer * Clone() const {return new Computer(*this);}
    virtual inline int get_m1() const {return 0;}
    virtual inline int get_m2() const {return 0;}

    private:
    int *m_a, *m_b;
};

Computer::Computer(int a_, int b_)
{
    m_a=new int(a_);
    m_b=new int(b_);
}

Computer::Computer(const Computer &amp;rhs)
{
    cout &lt;&lt; &quot;CopK Com\n&quot;;
    m_a=new int(rhs.get_a());
    m_b=new int(rhs.get_b());

}

Computer::~Computer()
{
    delete m_a, m_b;
}

class Rating1 : public Computer
{
    public:
    Rating1(int a_, int b_, int m1_, int m2_);
    Rating1(const Rating1 &amp;rhs);
    ~Rating1();
    inline int get_m1() const {return *m_m1;}
    inline int get_m2() const {return *m_m2;}
    Rating1 * Clone() const {return new Rating1(*this);}

    private:
    int *m_m1, *m_m2;
};

Rating1::Rating1(int a_, int b_, int m1_, int m2_)
:Computer(a_,b_)
{
    m_m1=new int(m1_);
    m_m2=new int(m2_);
}

Rating1::Rating1(const Rating1 &amp;rhs)
:Computer(rhs)
{
    cout &lt;&lt; &quot;CopK Rat\n&quot;;
    m_m1=new int(rhs.get_m1());
    m_m2=new int(rhs.get_m2());
}

Rating1::~Rating1()
{
    delete m_m1, m_m2;
}

int main()
{
    Computer *hans=new Rating1(18,37,23,41);
    cout &lt;&lt; &quot;BASIS KLASSE: &quot; &lt;&lt; hans-&gt;get_a() &lt;&lt; &quot; &quot; &lt;&lt; hans-&gt;get_b() &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;ABGELEITETE KLASSE: &quot; &lt;&lt; hans-&gt;get_m1() &lt;&lt; &quot; &quot; &lt;&lt; hans-&gt;get_m2() &lt;&lt; &quot;\n\n&quot;;
    Computer *werner=new Rating1(33,44,2,3);
    cout &lt;&lt; &quot;BASIS KLASSE: &quot; &lt;&lt; werner-&gt;get_a() &lt;&lt; &quot; &quot; &lt;&lt; werner-&gt;get_b() &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;ABGELEITETE KLASSE: &quot; &lt;&lt; werner-&gt;get_m1() &lt;&lt; &quot; &quot; &lt;&lt; werner-&gt;get_m2() &lt;&lt; &quot;\n\n&quot;;
    delete werner;
    werner=NULL;
    werner=hans-&gt;Clone();
    cout &lt;&lt; &quot;BASIS KLASSE: &quot; &lt;&lt; werner-&gt;get_a() &lt;&lt; &quot; &quot; &lt;&lt; werner-&gt;get_b() &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;ABGELEITETE KLASSE: &quot; &lt;&lt; werner-&gt;get_m1() &lt;&lt; &quot; &quot; &lt;&lt; werner-&gt;get_m2() &lt;&lt; &quot;\n\n&quot;;

    delete hans, werner;

    return 0;
}
</code></pre>
<p>AUSGABE:</p>
<blockquote>
<p>BASIS KLASSE: 18 37<br />
ABGELEITETE KLASSE: 23 41</p>
<p>BASIS KLASSE: 33 44<br />
ABGELEITETE KLASSE: 2 3</p>
<p>CopK Com<br />
CopK Rat<br />
BASIS KLASSE: 18 37<br />
ABGELEITETE KLASSE: 23 41</p>
</blockquote>
<p>So als erste steht da ja jetzt &quot;CopK Com&quot; mhhh? versteh ich jetzt mal gar nicht. Also jetzt geh ich den Ablauf mal durch:<br />
Mit dem Befehl hier gehts los</p>
<pre><code class="language-cpp">werner=hans-&gt;Clone();
</code></pre>
<p>so, dann wird im &quot;Klasse Computer&quot; Teil, &quot;Clone()&quot; aufgerufen, dieser aufruf wird an den &quot;Klasse Rating1&quot; Teil weiter geschickt, da die Methode dort redefiniert ist.<br />
Dort wird dann neuer Speicher reserviert, und gleich ein Objekt nämlich &quot;*this&quot; übergeben.</p>
<pre><code class="language-cpp">return new Rating1(*this);
</code></pre>
<p>Dadurch wird im soeben neu erstellten Objekt &quot;werner&quot; der Kopierkonstruktor aufgerufen, da ja ein ganze Objekt übergeben wird. Und dann sollte somit also der Kopierkonstrutktor vom &quot;Computer&quot; teil aufgerufen werden. So weiter weiß ich nicht mehr. Mh...verdammt! Warum wird dann eigentlich der Kopierkonstruktor vom &quot;Rating1&quot; Teil aufgerufen...mh schon klar, der muss schon aufgerufen werden...aber nach meiner Logigk kann der gar nicht aufgerufen werden....da Kopierkostruktoren ja nicht virtuell sein können, also sollte doch nach dem Aufruf vom &quot;Computer&quot; Kopierkonstrutor Schluss sein?...MHHH!!!<br />
Kann mir jemand bitte diesen Ablauf mal genau erklären?</p>
<p>Dankeschön schon mal im Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1356536</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356536</guid><dc:creator><![CDATA[Stromberg]]></dc:creator><pubDate>Fri, 31 Aug 2007 22:19:23 GMT</pubDate></item><item><title><![CDATA[Reply to Methode aus Basisklasse aufrufen. on Sat, 01 Sep 2007 08:39:54 GMT]]></title><description><![CDATA[<p>Hat niemand eine Antwort parat?<br />
MfG<br />
Stromberg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1356619</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356619</guid><dc:creator><![CDATA[Stromberg]]></dc:creator><pubDate>Sat, 01 Sep 2007 08:39:54 GMT</pubDate></item><item><title><![CDATA[Reply to Methode aus Basisklasse aufrufen. on Sat, 01 Sep 2007 09:07:20 GMT]]></title><description><![CDATA[<p>Stromberg schrieb:</p>
<blockquote>
<p>So als erste steht da ja jetzt &quot;CopK Com&quot; mhhh? versteh ich jetzt mal gar nicht. Also jetzt geh ich den Ablauf mal durch:<br />
Mit dem Befehl hier gehts los</p>
<pre><code class="language-cpp">werner=hans-&gt;Clone();
</code></pre>
<p>so, dann wird im &quot;Klasse Computer&quot; Teil, &quot;Clone()&quot; aufgerufen, dieser aufruf wird an den &quot;Klasse Rating1&quot; Teil weiter geschickt, da die Methode dort redefiniert ist.<br />
Dort wird dann neuer Speicher reserviert, und gleich ein Objekt nämlich &quot;*this&quot; übergeben.</p>
<pre><code class="language-cpp">return new Rating1(*this);
</code></pre>
<p>Dadurch wird im soeben neu erstellten Objekt &quot;werner&quot; der Kopierkonstruktor aufgerufen, da ja ein ganze Objekt übergeben wird. Und dann sollte somit also der Kopierkonstrutktor vom &quot;Computer&quot; teil aufgerufen werden. So weiter weiß ich nicht mehr. Mh...verdammt! Warum wird dann eigentlich der Kopierkonstruktor vom &quot;Rating1&quot; Teil aufgerufen...mh schon klar, der muss schon aufgerufen werden...aber nach meiner Logigk kann der gar nicht aufgerufen werden....da Kopierkostruktoren ja nicht virtuell sein können, also sollte doch nach dem Aufruf vom &quot;Computer&quot; Kopierkonstrutor Schluss sein?...MHHH!!!<br />
Kann mir jemand bitte diesen Ablauf mal genau erklären?</p>
</blockquote>
<p>Ich versuchs mal, auch wenn ich die Frage jetzt nicht <em>ganz</em> verstanden hab <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="😃"
    /></p>
<p>Also, du rufst <code>new Rating1(*this)</code> auf. Deine Feststellung &quot;Dadurch wird im soeben neu erstellten Objekt &quot;werner&quot; der Kopierkonstruktor aufgerufen&quot; ist aber leider falsch :p An dieser Stelle ist ja der Zeiger &quot;werner&quot; aus der main-Funktion noch unbelegt. Es wird also erstmal Speicherplatz reserviert und der Kopierkonstruktor von Rating1 aufgerufen. Haste nämlich Recht, Konstruktoren können nicht virtuell sein, deshalb wird immer von der Klasse der Konstruktor aufgerufen, die bei &quot;new&quot; dabeisteht <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="🙂"
    /> So, jo, dann müsste ja eigentlich alles klar sein, oder? <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/1356638</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356638</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sat, 01 Sep 2007 09:07:20 GMT</pubDate></item><item><title><![CDATA[Reply to Methode aus Basisklasse aufrufen. on Sat, 01 Sep 2007 09:13:59 GMT]]></title><description><![CDATA[<p>Mh nein, leider nicht <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 />
Weil bei der Ausgabe aus der Konsole sieht man doch, das zwei Kopierkosntruktoren aufgerufen werden, und der vom &quot;Computer Teil&quot;, wird auch noch zuerst aufgerufen:</p>
<blockquote>
<p>BASIS KLASSE: 18 37<br />
ABGELEITETE KLASSE: 23 41</p>
<p>BASIS KLASSE: 33 44<br />
ABGELEITETE KLASSE: 2 3</p>
<p>CopK Com // &lt;-- Kopierkonstruktor &quot;Computer Teil&quot;<br />
CopK Rat // &lt;-- Kopierkonstruktor &quot;Rating1 Teil&quot;<br />
BASIS KLASSE: 18 37<br />
ABGELEITETE KLASSE: 23 41</p>
</blockquote>
<p>Mhhhh?</p>
<p>MfG<br />
Stromberg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1356643</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356643</guid><dc:creator><![CDATA[Stromberg]]></dc:creator><pubDate>Sat, 01 Sep 2007 09:13:59 GMT</pubDate></item><item><title><![CDATA[Reply to Methode aus Basisklasse aufrufen. on Sat, 01 Sep 2007 09:19:55 GMT]]></title><description><![CDATA[<p>Oh, right <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>
<pre><code class="language-cpp">Rating1::Rating1(const Rating1 &amp;rhs)  // Der Kopier-Konstruktor von Rating1
:Computer(rhs)                        // &lt;- hier rufst doch selber den Kopier-Konstruktor von Computer auf
{
    cout &lt;&lt; &quot;CopK Rat\n&quot;;
    m_m1=new int(rhs.get_m1());
    m_m2=new int(rhs.get_m2());
}
</code></pre>
<p>merkste? hm? hm? hm? <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/1356648</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356648</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sat, 01 Sep 2007 09:19:55 GMT</pubDate></item><item><title><![CDATA[Reply to Methode aus Basisklasse aufrufen. on Sat, 01 Sep 2007 09:24:42 GMT]]></title><description><![CDATA[<p>AHHHH!!!! MHMHMHM!! KAPISCHE <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="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1356651</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356651</guid><dc:creator><![CDATA[Stromberg]]></dc:creator><pubDate>Sat, 01 Sep 2007 09:24:42 GMT</pubDate></item><item><title><![CDATA[Reply to Methode aus Basisklasse aufrufen. on Sat, 01 Sep 2007 09:39:29 GMT]]></title><description><![CDATA[<p>okay, dann wäre da noch das mit dem was &quot;.filmor vorhin gesagt hat:</p>
<p>.filmor schrieb:</p>
<blockquote>
<p>Ich bin mir nicht ganz sicher, aber wenn ich Recht habe ist das dein zweites Speicherleck in diesem Programm, da „hans“ nicht freigegeben wird.</p>
<p>Der Grund dass das nicht so ist ist, dass das Standardverhalten des Kommaoperators ist, alle Ausdrücke auszuwerten, aber nur den letzten zurückzugeben. Das heißt, hier wird genau einmal der Speicher freigegeben.</p>
</blockquote>
<p>Meine Frage dazu war:<br />
[quote=&quot;Stromberg&quot;]<br />
Tut mir leid, aber ich verstehe nicht so ganz, meinst du das man nicht:</p>
<pre><code class="language-cpp">delete hans, werner;
</code></pre>
<p>schreiben sollte, sondern:</p>
<pre><code class="language-cpp">delete hans;
delete werner;
</code></pre>
<p>???</p>
<p>Soll ich dann in Zukunft nachm &quot;delete&quot; nur immer eine Sache angeben? Weil in Zeile 38 und Zeile 73 hab ich das ja auch so mit &quot;,&quot; komma gemacht.</p>
<p>Sieht sonst noch irgendjemand eine Speicherverletzung?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Computer
{
    public:
    Computer(int a_, int b_);
    Computer(const Computer &amp;rhs);
    virtual ~Computer();
    inline int get_a() const {return *m_a;}
    inline int get_b() const {return *m_b;}
    virtual Computer * Clone() const {return new Computer(*this);}
    virtual inline int get_m1() const {return 0;}
    virtual inline int get_m2() const {return 0;}

    private:
    int *m_a, *m_b;
};

Computer::Computer(int a_, int b_)
{
    m_a=new int(a_);
    m_b=new int(b_);
}

Computer::Computer(const Computer &amp;rhs)
{
    cout &lt;&lt; &quot;CopK Com\n&quot;;
    m_a=new int(rhs.get_a());
    m_b=new int(rhs.get_b());

}

Computer::~Computer()
{
    delete m_a, m_b;
}

class Rating1 : public Computer
{
    public:
    Rating1(int a_, int b_, int m1_, int m2_);
    Rating1(const Rating1 &amp;rhs);
    ~Rating1();
    inline int get_m1() const {return *m_m1;}
    inline int get_m2() const {return *m_m2;}
    Rating1 * Clone() const {return new Rating1(*this);}

    private:
    int *m_m1, *m_m2;
};

Rating1::Rating1(int a_, int b_, int m1_, int m2_)
:Computer(a_,b_)
{
    m_m1=new int(m1_);
    m_m2=new int(m2_);
}

Rating1::Rating1(const Rating1 &amp;rhs)
:Computer(rhs)
{
    cout &lt;&lt; &quot;CopK Rat\n&quot;;
    m_m1=new int(rhs.get_m1());
    m_m2=new int(rhs.get_m2());
}

Rating1::~Rating1()
{
    delete m_m1, m_m2;
}

int main()
{
    Computer *hans=new Rating1(18,37,23,41);
    cout &lt;&lt; &quot;BASIS KLASSE: &quot; &lt;&lt; hans-&gt;get_a() &lt;&lt; &quot; &quot; &lt;&lt; hans-&gt;get_b() &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;ABGELEITETE KLASSE: &quot; &lt;&lt; hans-&gt;get_m1() &lt;&lt; &quot; &quot; &lt;&lt; hans-&gt;get_m2() &lt;&lt; &quot;\n\n&quot;;
    Computer *werner=new Rating1(33,44,2,3);
    cout &lt;&lt; &quot;BASIS KLASSE: &quot; &lt;&lt; werner-&gt;get_a() &lt;&lt; &quot; &quot; &lt;&lt; werner-&gt;get_b() &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;ABGELEITETE KLASSE: &quot; &lt;&lt; werner-&gt;get_m1() &lt;&lt; &quot; &quot; &lt;&lt; werner-&gt;get_m2() &lt;&lt; &quot;\n\n&quot;;
    delete werner;
    werner=NULL;
    werner=hans-&gt;Clone();
    cout &lt;&lt; &quot;BASIS KLASSE: &quot; &lt;&lt; werner-&gt;get_a() &lt;&lt; &quot; &quot; &lt;&lt; werner-&gt;get_b() &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;ABGELEITETE KLASSE: &quot; &lt;&lt; werner-&gt;get_m1() &lt;&lt; &quot; &quot; &lt;&lt; werner-&gt;get_m2() &lt;&lt; &quot;\n\n&quot;;

    delete hans;
    delete werner;

    return 0;
}
</code></pre>
<p>Dankeschön schon mal im Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1356657</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356657</guid><dc:creator><![CDATA[Stromberg]]></dc:creator><pubDate>Sat, 01 Sep 2007 09:39:29 GMT</pubDate></item><item><title><![CDATA[Reply to Methode aus Basisklasse aufrufen. on Sat, 01 Sep 2007 09:44:58 GMT]]></title><description><![CDATA[<p>Probiers doch einfach aus (selbst ist der Mann) <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>
<pre><code class="language-cpp">class Test
{
	public:
		Test() { cout &lt;&lt; &quot;Test()&quot; &lt;&lt; endl; }
		~Test() { cout &lt;&lt; &quot;~Test()&quot; &lt;&lt; endl; }
};

int main(int argc, char *argv[])
{
	Test* t1 = new Test();
	Test* t2 = new Test();
	delete t1, t2;
	return 0;
}
</code></pre>
<p>Und Speicherlecks sehe ich sonst keine. Nur könntest du m_a, m_b usw eigentlich auch als nicht-Zeiger implementieren, also einfach &quot;int m_a&quot;. Dann brauchst du nicht jedesmal die 4 Bytes an Speicherplatz reservieren, oder hast du durch die Zeiger einen bestimmten Nutzen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1356661</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356661</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sat, 01 Sep 2007 09:44:58 GMT</pubDate></item><item><title><![CDATA[Reply to Methode aus Basisklasse aufrufen. on Sat, 01 Sep 2007 09:58:00 GMT]]></title><description><![CDATA[<p>Nä, die sind halt nur Übunghalber, das es bisschen schwieriger ist, und ich was gescheites in meine Kopierkonstruktoren reinschreiben kann. Mh du nutzt ja auch:</p>
<pre><code class="language-cpp">delete t1, t2;
</code></pre>
<p>, mh dann mach ich das in Zukunft auch so! Was hat &quot;.filmor&quot; dann bloß vorhin gemeint?</p>
<p>MfG<br />
Stromberg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1356668</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356668</guid><dc:creator><![CDATA[Stromberg]]></dc:creator><pubDate>Sat, 01 Sep 2007 09:58:00 GMT</pubDate></item><item><title><![CDATA[Reply to Methode aus Basisklasse aufrufen. on Sat, 01 Sep 2007 10:23:33 GMT]]></title><description><![CDATA[<p>Moooooment! Ich hab nich gesagt, dass ich das auch nutze.. Ich wollte dir quasi nur vorschlagen, den Codeschnipsel mal durch den Compiler zu scheuchen - dann wäre dir nämlich aufgefallen, dass nur <em>ein</em> Destruktor aufgerufen wird <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="😉"
    /><br />
Mit einfach Worten: <code>delete a, b</code> geht nicht <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/1356690</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356690</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sat, 01 Sep 2007 10:23:33 GMT</pubDate></item><item><title><![CDATA[Reply to Methode aus Basisklasse aufrufen. on Sat, 01 Sep 2007 11:12:55 GMT]]></title><description><![CDATA[<p>Aha, okay. Is aber eigentlich blöd gemacht, das man immer n neues &quot;delete&quot; machen muss. Das hätt sich der Erfinder mal besser überlegen sollen! Und des dümste is ja eigentlich, warum gibts dann kein Compilier Fehler? Weil des is doch einfach falscher Syntax oder?</p>
<p>MfG<br />
Stromberg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1356707</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356707</guid><dc:creator><![CDATA[Stromberg]]></dc:creator><pubDate>Sat, 01 Sep 2007 11:12:55 GMT</pubDate></item><item><title><![CDATA[Reply to Methode aus Basisklasse aufrufen. on Sat, 01 Sep 2007 11:41:09 GMT]]></title><description><![CDATA[<p>Stromberg schrieb:</p>
<blockquote>
<p>Weil des is doch einfach falscher Syntax oder?</p>
</blockquote>
<p>Nein, das ist der Komma-Operator. Und wenn du den nicht kennst, ist das nicht die Schuld des &quot;Erfinders&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1356719</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356719</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Sat, 01 Sep 2007 11:41:09 GMT</pubDate></item><item><title><![CDATA[Reply to Methode aus Basisklasse aufrufen. on Sat, 01 Sep 2007 11:48:26 GMT]]></title><description><![CDATA[<p>Ja das verwirrt einen halt, weil sowas ist ja erlaubt:</p>
<pre><code class="language-cpp">int *m_a, *m_b;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1356724</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356724</guid><dc:creator><![CDATA[Stromberg]]></dc:creator><pubDate>Sat, 01 Sep 2007 11:48:26 GMT</pubDate></item><item><title><![CDATA[Reply to Methode aus Basisklasse aufrufen. on Sat, 01 Sep 2007 12:20:08 GMT]]></title><description><![CDATA[<p>Das ist das selbe Problem wie das Verwechseln von Konstruktor- und Zuweisungsoperatoraufruf. Es gibt einerseits Deklaration und Definitionen und andererseits Ausdrücke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1356742</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356742</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Sat, 01 Sep 2007 12:20:08 GMT</pubDate></item><item><title><![CDATA[Reply to Methode aus Basisklasse aufrufen. on Sat, 01 Sep 2007 12:20:37 GMT]]></title><description><![CDATA[<p>MFK schrieb:</p>
<blockquote>
<p>Nein, das ist der Komma-Operator. Und wenn du den nicht kennst, ist das nicht die Schuld des &quot;Erfinders&quot;.</p>
</blockquote>
<p>Sicher nicht die Schuld des Erfinders, aber besonders häufig wird er ja nicht erwähnt, erst recht nicht in kleineren Ich-lerne-C++-Büchern <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/1356743</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356743</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sat, 01 Sep 2007 12:20:37 GMT</pubDate></item><item><title><![CDATA[Reply to Methode aus Basisklasse aufrufen. on Sat, 01 Sep 2007 12:46:20 GMT]]></title><description><![CDATA[<p>Wo kann ich was über dne sog. &quot;Komma Operator&quot; finden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1356767</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356767</guid><dc:creator><![CDATA[Stromberg]]></dc:creator><pubDate>Sat, 01 Sep 2007 12:46:20 GMT</pubDate></item><item><title><![CDATA[Reply to Methode aus Basisklasse aufrufen. on Sat, 01 Sep 2007 13:11:42 GMT]]></title><description><![CDATA[<p>Eigentlich gibt's über den recht wenig zu sagen. Er steht sehr weit unten in der Rangfolge (also um ihn sicher anzuwenden (zb in Funktionsaufrufen) musst du schon Klammern setzen), er kann überladen werden (was man aber aufgrund der Verwechslungsgefahr recht selten tut, und wenn, dann nur mit einem deutlichen Hinweis) und sein Standardverhalten ist, wie oben beschrieben.</p>
<p>Im Prinzip wird der Kommaoperator auch immer nur auf zwei Elemente angewendet, also entspricht a, b, c dann ((a, b), c), was wiederum operator,(operator,(a, b), c) entspricht. Es werden beide Parameter ausgewertet und der Wert des rechten zurückgegeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1356784</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356784</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Sat, 01 Sep 2007 13:11:42 GMT</pubDate></item></channel></rss>