<?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 von operator=]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe eine Klasse, die den Zuweisungsoperator und den Kopierkonstruktor überschreibt. Von dieser leite ich eine weitere Klasse ab. Jetzt möchte ich einer Instanz der abgeleiteten mit &quot;=&quot; eine Instanz der Oberklasse zuweisen. Das mag der Compiler leider nicht. Im Code sieht das vereinfacht so aus:</p>
<pre><code>class mutter {

  operator=( mutter ob ) {

    daten = ob.daten;
  }
};

class kind : public mutter {
};

mutter m;
kind k;

k = m; // &lt;- hier hackts
</code></pre>
<p>Hat einer ne Idee, wieso das nicht geht? Werden die Operatoren nicht mit vererbt?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/168270/vererbung-von-operator</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 08:28:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/168270.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 20 Dec 2006 11:35:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vererbung von operator= on Wed, 20 Dec 2006 11:35:34 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe eine Klasse, die den Zuweisungsoperator und den Kopierkonstruktor überschreibt. Von dieser leite ich eine weitere Klasse ab. Jetzt möchte ich einer Instanz der abgeleiteten mit &quot;=&quot; eine Instanz der Oberklasse zuweisen. Das mag der Compiler leider nicht. Im Code sieht das vereinfacht so aus:</p>
<pre><code>class mutter {

  operator=( mutter ob ) {

    daten = ob.daten;
  }
};

class kind : public mutter {
};

mutter m;
kind k;

k = m; // &lt;- hier hackts
</code></pre>
<p>Hat einer ne Idee, wieso das nicht geht? Werden die Operatoren nicht mit vererbt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195303</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195303</guid><dc:creator><![CDATA[littlejohn]]></dc:creator><pubDate>Wed, 20 Dec 2006 11:35:34 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung von operator= on Wed, 20 Dec 2006 11:39:44 GMT]]></title><description><![CDATA[<p>Nein, operator= wird nicht vererbt (dazu ist er zu elementar), sondern für jede Klasse im Notfall neu erstellt.</p>
<p>Und der op= der abgeleiteten Klasse ruft erst den operator der Basisklasse auf und kopiert dann die Elemente, die neu dazugekommen sind. Allerdings willst du deinem kind-Objekt ein mutter-Objekt zuweisen - und da hat der Compiler keine Ahnung, woher er die Werte für die kind-Member nehmen soll.</p>
<p>(btw, wenn sich der op= auf ein &quot;daten=ob.daten&quot; reduziert, kannst du auch den Default-Operator dafür verwenden)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195307</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195307</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 20 Dec 2006 11:39:44 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung von operator= on Wed, 20 Dec 2006 11:47:01 GMT]]></title><description><![CDATA[<p>Ja, das Beispiel ist etwas zu simple. Der Operator macht mehr als einfach nur Daten zu kopieren und muss daher überschrieben werden.</p>
<p>Ich dacht halt, wenn ich kind=mutter machen, dann wird automatisch der Operator der Mutter genommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195312</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195312</guid><dc:creator><![CDATA[littlejohn]]></dc:creator><pubDate>Wed, 20 Dec 2006 11:47:01 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung von operator= on Wed, 20 Dec 2006 11:54:36 GMT]]></title><description><![CDATA[<p>Nein, wird er nicht - das geht nur in der anderen Richtung <code>m=k;</code> (oder wenn du explizit einen operator= definierst).</p>
<p>PS: Es ist zwar nicht wirklich vom Standard vorgeschrieben, aber üblicherweise sieht ein op= so aus:</p>
<pre><code class="language-cpp">class Typ
{
public:
  Typ&amp; operator=(const Typ&amp; other)
  {
    //eigentliche Zuweisung
    //achte auf mögliche Selbstzuweisungen
    return *this;
  }
}
</code></pre>
<p>(auf diese Weise kannst du auch Zuweisungsketten ( <code>a=b=c=somedata;</code> ) verwenden und du sparst dir eine Kopier-Operation)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195318</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195318</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 20 Dec 2006 11:54:36 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung von operator= on Wed, 20 Dec 2006 12:00:58 GMT]]></title><description><![CDATA[<p>Okay, danke! Wieder was gelernt... Ich hab nun allen abgeleiteten Klassen ihren eigenen Operator gegeben und alles ist gut.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195323</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195323</guid><dc:creator><![CDATA[littlejohn]]></dc:creator><pubDate>Wed, 20 Dec 2006 12:00:58 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung von operator= on Wed, 20 Dec 2006 12:10:31 GMT]]></title><description><![CDATA[<p>Denkst du zumindest *scnr*</p>
<p>Für den Moment mag ja der Compiler glücklich sein und dein Programm funktionieren. Aber ob dein Programm wirklich das macht, was es soll, steht auf einem anderen Blatt.</p>
<p>Beispiel gefällig:</p>
<pre><code class="language-cpp">class base
{
public:
  base&amp; operator=(const base&amp;);
...
};

class kind1 : public base
{
  int m_value;
public:
  kind1&amp; operator=(const base&amp; other)
  {
    base::operator=(other);// base-Anteil kopieren
    m_value = 0;           // eigene Anteile nicht verfügbar - Defaultwert verwenden
    return *this;
  }
};

class kind2 : public base {/* analog aufgebaut */};

int main()
{
  kind1 k1;
  kind2 k2;
  k2=k1;
}
</code></pre>
<p>Normalerweise sollte die letzte Anweisung scheitern, aber durch den eigenen operator= funktioniert das (k1 wird in ein base-Objekt umgewandelt und zugewiesen) - jetzt mußt du überlegen, ob das der Sinn der Sache ist.</p>
<p>PS: Kannst du mal grob umreißen, was du vorhast? Womöglich hat du ja schon im Ansatz des Klassendesigns einen Denkfehler eingebaut.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195330</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195330</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 20 Dec 2006 12:10:31 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung von operator= on Wed, 20 Dec 2006 12:15:15 GMT]]></title><description><![CDATA[<p>littlejohn schrieb:</p>
<blockquote>
<p>..<br />
&lt;- hier hackts</p>
</blockquote>
<p>Wer hackt ?<br />
&quot;....<br />
I cut down trees, I eat my lunch,<br />
I go to the lavat'ry.<br />
On Wednesdays I go shopping<br />
And have buttered scones for tea.<br />
...&quot;</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195335</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195335</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 20 Dec 2006 12:15:15 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung von operator= on Wed, 20 Dec 2006 12:23:23 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Nein, wird er nicht - das geht nur in der anderen Richtung <code>m=k;</code> ...</p>
</blockquote>
<p>... und das deswegen, weil so kein &quot;halbdefiniertes Ergebnis&quot; zurückbleibt.<br />
(Das Argument, dass der Mutter::operator=() nicht die zusätzlichen Kind-Attribute füllen kann, bleibt einfach bestehen).<br />
Beispiel (nur für diesen Zusammenhang, nicht für &quot;perfekten Code&quot;)</p>
<pre><code class="language-cpp">class Mutter {
protected:
    int a;
public:
    virtual void seta(int i) { a = i; }
....
}

class Kind : public Mutter {
    int b;
public:
    virtual void seta(int i) { Mutter::seta(i); b = 4*i; }
...
};
</code></pre>
<p>Wenn jetzt nur &quot;die Mutterteile&quot; (Mutter::a -&gt; Kind::Mutter::a) kopiert würden, hätte man in einem Kind a und b inkonsistent....<br />
Dagegen kann man durchaus konsistent Kind::Mutter::a auf Mutter::a kopieren.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195342</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195342</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 20 Dec 2006 12:23:23 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung von operator= on Wed, 20 Dec 2006 14:03:03 GMT]]></title><description><![CDATA[<p>Also was ich mir da gedacht hab ist folgendes:</p>
<p>Ich hab einen Interpreter und der hantiert mit einer Klasse namens &quot;Union&quot; herum. Diese hat Funktionen und Daten. Wenn der Interpreter fertig ist mit abarbeiten gibt er das Ergebnis der letzten Operation aus und zwar in Form einer solchen &quot;Union&quot;. Damit diese von aussen besser handhabbar wird, leite ich davon Klassen ab, z.b. &quot;UnionTools&quot;. Diese Klasse hat noch ein paar Funktionen, die innerhalb der Interpreters nicht benutzt/gebraucht werden.</p>
<p>das sieht dann ungefähr so aus:</p>
<pre><code>Union Interpret() {...}

UnionTools o = Interpret( &quot;...&quot; );
</code></pre>
<p>Die Union enthält nicht nur integer oder strings sondern kann auch weitere Unions enthalten. Daher wollte ich da noch ein paar Funktionen ranbauen um besser mit dem Ergebniss umgehen zu können.</p>
<p>Ist die Idee schlecht? Wenn ja, was wäre ein besserer Ansatz?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195414</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195414</guid><dc:creator><![CDATA[littlejohn]]></dc:creator><pubDate>Wed, 20 Dec 2006 14:03:03 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung von operator= on Wed, 20 Dec 2006 14:28:29 GMT]]></title><description><![CDATA[<p>und jetzt wirds richtig kompliziert. Das mit den operatoren funktioniert soweit wunderbar, aber der Kopierkonstruktor macht nicht was er soll:</p>
<p>Das ist die Klasse:</p>
<pre><code>/**
 * copy contructor
 */
Chess44Man::Chess44Man( const CMScriptDataUnion &amp;o ) {

	CMScriptDataUnion::CMScriptDataUnion( o );
}

void Chess44Man::operator=( CMScriptDataUnion o ) {

	CMScriptDataUnion::operator=( o );
}
</code></pre>
<p>und das die Zuweisung:</p>
<pre><code>CMScriptDataUnion oUnion( 100 );

	Chess44Man oMan = oUnion;  //Variante I: wird ausgeführt, bringt aber nichts

	oMan = oUnion;  //Variante II: wird korrekt ausgeführt
</code></pre>
<p>Also Variante I wird korrekt ausgeführt und wenn ich mit dem Debugger reingucke wird auch der Code der Kopierkonstruktors ausgeführt. Danach ist &quot;oMan&quot; allerdings &quot;leer&quot;, also die zugewiesenen Daten sind wieder vergessen.</p>
<p>Bei Variante II ist hinterher alles so wie es soll.</p>
<p>Woran liegt das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195432</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195432</guid><dc:creator><![CDATA[littlejohn]]></dc:creator><pubDate>Wed, 20 Dec 2006 14:28:29 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung von operator= on Wed, 20 Dec 2006 15:52:47 GMT]]></title><description><![CDATA[<p>Wie Scott Meyers sagt: Mache Basisklassen abstrakt!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195482</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195482</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Wed, 20 Dec 2006 15:52:47 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung von operator= on Wed, 20 Dec 2006 15:55:39 GMT]]></title><description><![CDATA[<p>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195483</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195483</guid><dc:creator><![CDATA[littlejohn]]></dc:creator><pubDate>Wed, 20 Dec 2006 15:55:39 GMT</pubDate></item></channel></rss>