<?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[Virtualität und Referenzen]]></title><description><![CDATA[<p>Hey Leute,</p>
<p>wenn man folgenden Zusammenhang hat:</p>
<pre><code class="language-cpp">class A {

public:
	virtual void foo() { cout &lt;&lt; &quot;A&quot; &lt;&lt; endl; }

};

class B : public A {

public:
	void foo() { cout &lt;&lt; &quot;B&quot; &lt;&lt; endl; }

};

void bar(A &amp;a) { 
	a.foo();	
}

int main()
{
	B b;
	bar(b);

	return 0;
}
</code></pre>
<p>dann erhält man wie erwartet die Ausgabe &quot;B&quot;.</p>
<p>Ändere ich jetzt den Code aber folgendermaßen ab:</p>
<pre><code class="language-cpp">/* ... */

void g(A a) { 
	a.foo();	
}

/* ... */
</code></pre>
<p>d.h. übergibt man den Parameter an &quot;bar&quot; nicht mehr per Referenz erhält man trotz &quot;virtual&quot; die Ausgabe &quot;A&quot;.</p>
<p>Was genau passiert hier, beim Aufruf von &quot;g(b)&quot; in der main-Funktion?<br />
Wird der Parameter hier so kopiert (Stichwort: Call-By-Value), dass die Kopie danach eine Instanz der Klasse A ist?</p>
<p>Falls ja ist dies schon eine Stolperfalle oder ist das Verhalten so gewünscht und tiefsinniger?</p>
<p>Gruß <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/topic/301668/virtualität-und-referenzen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 11 Aug 2026 22:44:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/301668.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 01 Apr 2012 12:16:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Virtualität und Referenzen on Sun, 01 Apr 2012 12:16:36 GMT]]></title><description><![CDATA[<p>Hey Leute,</p>
<p>wenn man folgenden Zusammenhang hat:</p>
<pre><code class="language-cpp">class A {

public:
	virtual void foo() { cout &lt;&lt; &quot;A&quot; &lt;&lt; endl; }

};

class B : public A {

public:
	void foo() { cout &lt;&lt; &quot;B&quot; &lt;&lt; endl; }

};

void bar(A &amp;a) { 
	a.foo();	
}

int main()
{
	B b;
	bar(b);

	return 0;
}
</code></pre>
<p>dann erhält man wie erwartet die Ausgabe &quot;B&quot;.</p>
<p>Ändere ich jetzt den Code aber folgendermaßen ab:</p>
<pre><code class="language-cpp">/* ... */

void g(A a) { 
	a.foo();	
}

/* ... */
</code></pre>
<p>d.h. übergibt man den Parameter an &quot;bar&quot; nicht mehr per Referenz erhält man trotz &quot;virtual&quot; die Ausgabe &quot;A&quot;.</p>
<p>Was genau passiert hier, beim Aufruf von &quot;g(b)&quot; in der main-Funktion?<br />
Wird der Parameter hier so kopiert (Stichwort: Call-By-Value), dass die Kopie danach eine Instanz der Klasse A ist?</p>
<p>Falls ja ist dies schon eine Stolperfalle oder ist das Verhalten so gewünscht und tiefsinniger?</p>
<p>Gruß <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/2197598</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197598</guid><dc:creator><![CDATA[MatheStein]]></dc:creator><pubDate>Sun, 01 Apr 2012 12:16:36 GMT</pubDate></item><item><title><![CDATA[Reply to Virtualität und Referenzen on Sun, 01 Apr 2012 12:27:49 GMT]]></title><description><![CDATA[<p>Stichworte: dynamic binding, static binding.<br />
Der Compieler sieht halt an der Stelle den statischen Typ &quot;A&quot; - keine Referenz oder Zeiger. Deshalb geht er davon aus, dass an der Stelle auch wirklich nur ein &quot;A&quot; ist, und baut einen direkten Aufruf von A::foo() ein - der Programmierer will es ja so.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197601</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197601</guid><dc:creator><![CDATA[arghonaut]]></dc:creator><pubDate>Sun, 01 Apr 2012 12:27:49 GMT</pubDate></item><item><title><![CDATA[Reply to Virtualität und Referenzen on Sun, 01 Apr 2012 12:31:48 GMT]]></title><description><![CDATA[<p>In dem Moment in dem du kopierst, hast du auch wirklich ein A. Geht ja auch gar nicht anders - sonst müsste A ja immer unterschiedlich groß sein. <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="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197602</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197602</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sun, 01 Apr 2012 12:31:48 GMT</pubDate></item><item><title><![CDATA[Reply to Virtualität und Referenzen on Sun, 01 Apr 2012 12:44:14 GMT]]></title><description><![CDATA[<p>Im Wesentlichen ist <code>a</code> eine lokale Kopie des A-Subobjekts von b.<br />
Google mal nach &quot;slicing&quot; in Verbindung mit &quot;c++&quot;.</p>
<p>Bei so vielen Anfängerfragen dürfte Dir doch inzwischen die Wichtigkeit gescheiter C++ Literatur aufgefallen sein! Oder soll das Spiel hier noch ein halbes Jahr weitergehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197608</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197608</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 01 Apr 2012 12:44:14 GMT</pubDate></item><item><title><![CDATA[Reply to Virtualität und Referenzen on Sun, 01 Apr 2012 17:55:47 GMT]]></title><description><![CDATA[<p>Die Literatur schweift leider teilweise sehr extrem aus, deswegen habe ich des öfteren hier Frage gestellt, meist aber mit dem Ziel handfeste Begriffe zu bekommen wie Object-Slicing um gezielt suchen zu können.</p>
<p>Ich hoffe die ganzen Fragen stören nicht zu sehr, falls doch lasst es mich wissen.</p>
<p>Viele Grüße <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/2197725</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197725</guid><dc:creator><![CDATA[MatheStein]]></dc:creator><pubDate>Sun, 01 Apr 2012 17:55:47 GMT</pubDate></item></channel></rss>