<?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[Frage zu unzulaessigen Referenzzuweisungen]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe gerade folgenden Beispielcode (nachdem ich urspruenglich einem kleinen Fehler gesucht hatte) geschrieben:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

class Base{
	public:
	virtual void im() = 0;
	virtual void imdata() = 0;
};

class A : public Base{
	public:
	A() : c('a'){}
	void im(){
		cout &lt;&lt; &quot;A&quot; &lt;&lt; endl;
	}
	void imdata(){
		cout &lt;&lt; c &lt;&lt; endl;
	}
	private:
	char c;
};

class B : public Base{
	public:
	B() : c('b'){}
	void im(){
		cout &lt;&lt; &quot;B&quot; &lt;&lt; endl;
	}
	void imdata(){
		cout &lt;&lt; c &lt;&lt; endl;
	}
	private:
	char c;
};

int main(int argc, char **argv){
	A a;
	B b;
	Base &amp; ref = a;

	a.im();
	b.im();
	ref.im();
	a.imdata();
	b.imdata();
	ref.imdata();

	ref = b; //fehlerhafte Zuweisung, wirkungslos?

	a.im();
	b.im();
	ref.im();
	a.imdata();
	b.imdata();
	ref.imdata();

	int i = 2;
	int j = 3;
	int &amp; k = i;

	cout &lt;&lt; i &lt;&lt; &quot; &quot; &lt;&lt; j &lt;&lt; &quot; &quot; &lt;&lt; k &lt;&lt; endl;
	k = j;
	cout &lt;&lt; i &lt;&lt; &quot; &quot; &lt;&lt; j &lt;&lt; &quot; &quot; &lt;&lt; k &lt;&lt; endl;

	return 0;
}
</code></pre>
<p>Er gibt folgendes aus:</p>
<pre><code>A
B
A
a
b
a
A
B
A
a
b
a
2 3 2
3 3 3
</code></pre>
<p>Was passiert hier? Bei meinem urspruenglichen Problem, hatte ich auf aehnliche Art (wenn auch mit wesentlich mehr Indirektion) ein Objekt ueberschrieben.<br />
Hier haette ich nach der zweiten Zuweisung auf ref die Ausgabe BBBbbb erwartet.<br />
Warum passiert dies nicht? Und warum ist nicht vorgesehen, solche potentiell unzulaessigen Zuweisungen nur mit casts zu erlauben. Immerhin kann hier ein Objekt eines anderen Subtypen ueberschrieben werden.<br />
Die Integer Referenz, arbeitet, wie ich es mir gedacht haette.</p>
<p>Vielen Dank fuer eure Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/296857/frage-zu-unzulaessigen-referenzzuweisungen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 14 Aug 2026 18:42:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/296857.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 13 Dec 2011 21:07:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu unzulaessigen Referenzzuweisungen on Tue, 13 Dec 2011 21:07:18 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe gerade folgenden Beispielcode (nachdem ich urspruenglich einem kleinen Fehler gesucht hatte) geschrieben:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

class Base{
	public:
	virtual void im() = 0;
	virtual void imdata() = 0;
};

class A : public Base{
	public:
	A() : c('a'){}
	void im(){
		cout &lt;&lt; &quot;A&quot; &lt;&lt; endl;
	}
	void imdata(){
		cout &lt;&lt; c &lt;&lt; endl;
	}
	private:
	char c;
};

class B : public Base{
	public:
	B() : c('b'){}
	void im(){
		cout &lt;&lt; &quot;B&quot; &lt;&lt; endl;
	}
	void imdata(){
		cout &lt;&lt; c &lt;&lt; endl;
	}
	private:
	char c;
};

int main(int argc, char **argv){
	A a;
	B b;
	Base &amp; ref = a;

	a.im();
	b.im();
	ref.im();
	a.imdata();
	b.imdata();
	ref.imdata();

	ref = b; //fehlerhafte Zuweisung, wirkungslos?

	a.im();
	b.im();
	ref.im();
	a.imdata();
	b.imdata();
	ref.imdata();

	int i = 2;
	int j = 3;
	int &amp; k = i;

	cout &lt;&lt; i &lt;&lt; &quot; &quot; &lt;&lt; j &lt;&lt; &quot; &quot; &lt;&lt; k &lt;&lt; endl;
	k = j;
	cout &lt;&lt; i &lt;&lt; &quot; &quot; &lt;&lt; j &lt;&lt; &quot; &quot; &lt;&lt; k &lt;&lt; endl;

	return 0;
}
</code></pre>
<p>Er gibt folgendes aus:</p>
<pre><code>A
B
A
a
b
a
A
B
A
a
b
a
2 3 2
3 3 3
</code></pre>
<p>Was passiert hier? Bei meinem urspruenglichen Problem, hatte ich auf aehnliche Art (wenn auch mit wesentlich mehr Indirektion) ein Objekt ueberschrieben.<br />
Hier haette ich nach der zweiten Zuweisung auf ref die Ausgabe BBBbbb erwartet.<br />
Warum passiert dies nicht? Und warum ist nicht vorgesehen, solche potentiell unzulaessigen Zuweisungen nur mit casts zu erlauben. Immerhin kann hier ein Objekt eines anderen Subtypen ueberschrieben werden.<br />
Die Integer Referenz, arbeitet, wie ich es mir gedacht haette.</p>
<p>Vielen Dank fuer eure Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2156674</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2156674</guid><dc:creator><![CDATA[topfplanze]]></dc:creator><pubDate>Tue, 13 Dec 2011 21:07:18 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu unzulaessigen Referenzzuweisungen on Tue, 13 Dec 2011 21:23:43 GMT]]></title><description><![CDATA[<p>topfplanze schrieb:</p>
<blockquote>
<p>Immerhin kann hier ein Objekt eines anderen Subtypen ueberschrieben werden.</p>
</blockquote>
<p>Das ist nicht was passiert. Alles was passiert, ist, dass der Basisklassenanteil des a-Objektes mit dem Inhalt des Basisklassenanteils des b-Objektes überschrieben wird. Da die Basisklasse gar keine Daten enthält, passiert effektiv gar nichts. Der dynamische Typ des Objektes, auf das ref verweist, ändert sich schon gar nicht.<br />
Das ist auch nicht <em>der</em> tpische Slicing-Fall in dem ein Baisklassenobjekt neu erzeugt wird. Es wäre möglich, diese Zuweisung zu vermeiden, indem der Zuweisungsoperator wenigstens protected deklariert wird, praktisch sehe ich aber kein Problem. Sinnvoller Umgang mit polymorphen Basisklassen involviert für gewöhnlich Zeiger oder Referenzen derart, dass Operator i.d.R. nicht direkt angewendete werden können, eine solche Zuweisung wird also selten zufällig entstehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2156682</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2156682</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 13 Dec 2011 21:23:43 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu unzulaessigen Referenzzuweisungen on Tue, 13 Dec 2011 21:34:35 GMT]]></title><description><![CDATA[<p>Danke, das hat mein Verstaendnis ueber Referenzen ein wenig verbessert, auch wenn ich das so nicht erwartet haette, dass nur der statische Typ ueberschrieben wird.<br />
Falls das hier noch mal jemand liest:<br />
Ich habe den Testcode wie folgt angepasst.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

class Base{
	public:
	Base(){
		static int ctorcount = 0;
		baseInt = ctorcount++;
	}
	virtual void im() = 0;
	virtual void imdata() = 0;
	void imdataBase(){
		cout &lt;&lt; baseInt &lt;&lt; endl;
	}
	private:
	int baseInt;
};

class A : public Base{
	public:
	A() : c('a'){}
	void im(){
		cout &lt;&lt; &quot;A&quot; &lt;&lt; endl;
	}
	void imdata(){
		cout &lt;&lt; c &lt;&lt; endl;
	}
	private:
	char c;
};

class B : public Base{
	public:
	B() : c('b'){}
	void im(){
		cout &lt;&lt; &quot;B&quot; &lt;&lt; endl;
	}
	void imdata(){
		cout &lt;&lt; c &lt;&lt; endl;
	}
	private:
	char c;
};

int main(int argc, char **argv){
	A a;
	B b;
	Base &amp; ref = a;

	a.im();
	b.im();
	ref.im();
	a.imdata();
	b.imdata();
	ref.imdata();
	a.imdataBase();
	b.imdataBase();
	ref.imdataBase();

	ref = b;

	a.im();
	b.im();
	ref.im();
	a.imdata();
	b.imdata();
	ref.imdata();
	a.imdataBase();
	b.imdataBase();
	ref.imdataBase();

	int i = 2;
	int j = 3;
	int &amp; k = i;

	cout &lt;&lt; i &lt;&lt; &quot; &quot; &lt;&lt; j &lt;&lt; &quot; &quot; &lt;&lt; k &lt;&lt; endl;
	k = j;
	cout &lt;&lt; i &lt;&lt; &quot; &quot; &lt;&lt; j &lt;&lt; &quot; &quot; &lt;&lt; k &lt;&lt; endl;

	return 0;
}
</code></pre>
<p>Die Ausgabe aendert sich dann wie erwartet auf:</p>
<pre><code>A
B
A
a
b
a
0
1
0
A
B
A
a
b
a
1
1
1
2 3 2
3 3 3
</code></pre>
<p>DAnke fuer die Erklaerung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2156688</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2156688</guid><dc:creator><![CDATA[topfplanze]]></dc:creator><pubDate>Tue, 13 Dec 2011 21:34:35 GMT</pubDate></item></channel></rss>