<?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[Vererbung]]></title><description><![CDATA[<p>Hi folgende Vererbung ist mir nicht ganz klar ich hoffe mir kann da jemand weiterhelfen....</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class A {

public:

A(int j): i(j) {}

A&amp; operator=(const A&amp; a) {
cout &lt;&lt; &quot; A::operator=\n&quot;;
i = a.i;
return *this;
}

virtual void print(){ 
cout &lt;&lt; &quot; A: i = &quot; &lt;&lt; i; 
}

private:

int i;
};

class B : public A {

public:

B(int k): A(k),j(k*k) {}

void print() {
A::print();
cout &lt;&lt; &quot;; B: j = &quot; &lt;&lt; j;
}

private:

int j;

};

int main() {

B b1(2), b2(3);
cout &lt;&lt; &quot;b1: &quot;; b1.print(); cout &lt;&lt; endl;
cout &lt;&lt; &quot;b2: &quot;; b2.print(); cout &lt;&lt; endl;
cout &lt;&lt; &quot;b1 = b2:&quot;; b1=b2; 
cout &lt;&lt; &quot;b1: &quot;; b1.print(); cout &lt;&lt; endl;
return 0;
}

// Ausgabe:
// b1: A: i = 2; B: j = 4
// b2: A: i = 3; B: j = 9
// b1 = b2: A::operator=
// b1: A: i = 3; B: j = 9
</code></pre>
<p>bei der Ausgabe sind mir die ersten 3 Zeilen klar, in der 4ten Allerdings wundere ich mich warum j nicht 4 ist da ja der zuweisungsoperator nur in A ( also der Oberklasse ) beschrieben ist und hierbei nur i entsprechend übernommen wird. Was mich zu der idee führte das nach der zuweisung mit = und arbarbeiten des operators aus A nochmal der Kopierkonstruktor aufgerufen wird, allerdings entfernt man in A i = a.i; so ergibt sich i = 2 und j = 9</p>
<p>kann mir jemand erklären warum ?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/220687/vererbung</link><generator>RSS for Node</generator><lastBuildDate>Tue, 06 Oct 2026 21:21:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/220687.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 19 Aug 2008 17:44:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vererbung on Tue, 19 Aug 2008 17:44:25 GMT]]></title><description><![CDATA[<p>Hi folgende Vererbung ist mir nicht ganz klar ich hoffe mir kann da jemand weiterhelfen....</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class A {

public:

A(int j): i(j) {}

A&amp; operator=(const A&amp; a) {
cout &lt;&lt; &quot; A::operator=\n&quot;;
i = a.i;
return *this;
}

virtual void print(){ 
cout &lt;&lt; &quot; A: i = &quot; &lt;&lt; i; 
}

private:

int i;
};

class B : public A {

public:

B(int k): A(k),j(k*k) {}

void print() {
A::print();
cout &lt;&lt; &quot;; B: j = &quot; &lt;&lt; j;
}

private:

int j;

};

int main() {

B b1(2), b2(3);
cout &lt;&lt; &quot;b1: &quot;; b1.print(); cout &lt;&lt; endl;
cout &lt;&lt; &quot;b2: &quot;; b2.print(); cout &lt;&lt; endl;
cout &lt;&lt; &quot;b1 = b2:&quot;; b1=b2; 
cout &lt;&lt; &quot;b1: &quot;; b1.print(); cout &lt;&lt; endl;
return 0;
}

// Ausgabe:
// b1: A: i = 2; B: j = 4
// b2: A: i = 3; B: j = 9
// b1 = b2: A::operator=
// b1: A: i = 3; B: j = 9
</code></pre>
<p>bei der Ausgabe sind mir die ersten 3 Zeilen klar, in der 4ten Allerdings wundere ich mich warum j nicht 4 ist da ja der zuweisungsoperator nur in A ( also der Oberklasse ) beschrieben ist und hierbei nur i entsprechend übernommen wird. Was mich zu der idee führte das nach der zuweisung mit = und arbarbeiten des operators aus A nochmal der Kopierkonstruktor aufgerufen wird, allerdings entfernt man in A i = a.i; so ergibt sich i = 2 und j = 9</p>
<p>kann mir jemand erklären warum ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1567776</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1567776</guid><dc:creator><![CDATA[Tallan]]></dc:creator><pubDate>Tue, 19 Aug 2008 17:44:25 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung on Tue, 19 Aug 2008 17:57:56 GMT]]></title><description><![CDATA[<p>Wenn du keinen eigenen Zuweisungsoperator deklarierst, macht der Compiler das für dich. Der vom Compiler generierte Zuweisungsoperator ruft in der üblichen Reihenfolge die Zuweisungsoperatoren aller Basisklassen und Member auf (kleine Bemerkung am Rande: das bedeutet, dass dieser Operator im Allgemeinen nicht exception-sicher ist). Genau das passiert hier für die Klasse B.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1567781</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1567781</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 19 Aug 2008 17:57:56 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung on Tue, 19 Aug 2008 18:07:52 GMT]]></title><description><![CDATA[<p>Erstmal danke für die Antwort,<br />
also wird für i der zuweisungsoperator aus A genutzt und für j vom compiler ein eigener erstellt ? Und warum falls das so ist wie ich grade schrieb wird dann sofern ich aus A i = a.i; rausnehme nicht auch automatisch einer für i geschrieben ( genau wie bei j ) ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1567783</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1567783</guid><dc:creator><![CDATA[Tallan]]></dc:creator><pubDate>Tue, 19 Aug 2008 18:07:52 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung on Tue, 19 Aug 2008 18:15:09 GMT]]></title><description><![CDATA[<p>Für i und j werden keine Zuweisungsoperatoren geschrieben. Beides sind ints, und der Compiler weiß bereits, wie man ints kopiert. Zuweiungsoperatoren können nur für Klassen überladen werden, und in jeder Klasse existiert wenigstens ein für diese Klasse überladener Zuweisungsoperator, weil das der Compiler für dich übernimmt, falls du es selbst nicht tust. Dieser vom Compiler generierte Zuweisungsoperator hat stets ein ganz bestimmtes Verhalten, indem alle Basisklassen und Member einzeln zugewiesen werden (was im Falle von Basisklassen oder Membern, die selbst Klassenobjekte sind, den Aufruf der jeweiligen Zuweisungsoperatoren zur Folge hat).<br />
Im Übrigen verhält sich das ganz analog zum Copy-ctor.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1567787</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1567787</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 19 Aug 2008 18:15:09 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung on Tue, 19 Aug 2008 20:31:30 GMT]]></title><description><![CDATA[<p>was aber nicht erklärt warum wenn in A i = a.i; gestrichen wird nur j übernommen wird, oder verhält es sich so das zu jedem nicht definierten vom compiler etwas erzeugt wird, da es für die Klasse A ja den = operator gibt wird dieser genommen und nur die elemente aus B mit dem vom Compiler erzeugtem = verarbeitet ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1567863</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1567863</guid><dc:creator><![CDATA[Tallan]]></dc:creator><pubDate>Tue, 19 Aug 2008 20:31:30 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung on Tue, 19 Aug 2008 20:50:55 GMT]]></title><description><![CDATA[<p>Genau, wenn kein Zuweisungsoperator für eine Klasse existiert wird er vom Compiler (so wie er es meint) erstellt.<br />
Also wird bei einem leeren operator= einfach nichts kopiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1567871</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1567871</guid><dc:creator><![CDATA[lagalopex]]></dc:creator><pubDate>Tue, 19 Aug 2008 20:50:55 GMT</pubDate></item></channel></rss>