<?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[Vector von Basisklasse und Aufruf virtueller Funktionen]]></title><description><![CDATA[<p>Hallo liebes Forum! Ich komme aus der Java Welt und stolpere über ein wahrscheinlich triviales C++ Problem.</p>
<p>Ich habe eine Instanz von vector&lt;Fahrzeug&gt; und möchte über alle Fahrzeuge iterieren. Die Klasse Fahrzeug hat eine virtual print() Methode, die in den jeweiligen Klassen überschrieben ist und den Typ ausgibt, ob es eine Subklasse von Auto, LKW oder Motorrad ist.</p>
<p>Nun mein Problem liegt in folgendem Code:</p>
<pre><code class="language-cpp">for(vector&lt;Fahrzeug&gt;::iterator i = v.begin(); i != v.end(); ++i) {
    (*i).print();
}
</code></pre>
<p>In Java würde dieser Code jeweils den entsprechenden Typ (also z. B. Auto) ausgeben, in meinem Beispiel aber immer Fahrzeug. Eine google Recherche brachte den Begriff Slicing hervor, allerdings verstehe ich nicht, wie ich dieses Problem lösen kann?! <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="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/305463/vector-von-basisklasse-und-aufruf-virtueller-funktionen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 08 Aug 2026 22:13:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/305463.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 29 Jun 2012 18:31:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vector von Basisklasse und Aufruf virtueller Funktionen on Fri, 29 Jun 2012 18:31:57 GMT]]></title><description><![CDATA[<p>Hallo liebes Forum! Ich komme aus der Java Welt und stolpere über ein wahrscheinlich triviales C++ Problem.</p>
<p>Ich habe eine Instanz von vector&lt;Fahrzeug&gt; und möchte über alle Fahrzeuge iterieren. Die Klasse Fahrzeug hat eine virtual print() Methode, die in den jeweiligen Klassen überschrieben ist und den Typ ausgibt, ob es eine Subklasse von Auto, LKW oder Motorrad ist.</p>
<p>Nun mein Problem liegt in folgendem Code:</p>
<pre><code class="language-cpp">for(vector&lt;Fahrzeug&gt;::iterator i = v.begin(); i != v.end(); ++i) {
    (*i).print();
}
</code></pre>
<p>In Java würde dieser Code jeweils den entsprechenden Typ (also z. B. Auto) ausgeben, in meinem Beispiel aber immer Fahrzeug. Eine google Recherche brachte den Begriff Slicing hervor, allerdings verstehe ich nicht, wie ich dieses Problem lösen kann?! <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="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2228536</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228536</guid><dc:creator><![CDATA[jule86]]></dc:creator><pubDate>Fri, 29 Jun 2012 18:31:57 GMT</pubDate></item><item><title><![CDATA[Reply to Vector von Basisklasse und Aufruf virtueller Funktionen on Fri, 29 Jun 2012 18:37:22 GMT]]></title><description><![CDATA[<p>Willkommen im Forum!</p>
<p>Ja, dein ergoogelter Begriff ist richtig. Da C++ keine Indirektionen aufzwingt, wird hier der Teil der abgeleiteten Klasse einfach abgeschnitten. Indem du jetzt selbst Zeiger verwendest, kannst du das Problem lösen:</p>
<pre><code class="language-cpp">vector&lt;Fahrzeug*&gt;
</code></pre>
<p>Bzw noch besser:</p>
<pre><code class="language-cpp">vector&lt;unique_ptr&lt;Fahrzeug&gt;&gt;
</code></pre>
<p>Das Problem bei Zeigern im Vector ist nämlich dass der Vector die Objekte hinter den Zeigern nicht automatisch mitlöscht. Dazu dient unique_ptr. Genaueres schlägst du am besten nach. <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>
<p>Grüße,<br />
Der Kellerautomat</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2228539</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228539</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Fri, 29 Jun 2012 18:37:22 GMT</pubDate></item><item><title><![CDATA[Reply to Vector von Basisklasse und Aufruf virtueller Funktionen on Fri, 29 Jun 2012 18:39:21 GMT]]></title><description><![CDATA[<p>Du brauchst einen Basisklassenzeiger. Also</p>
<pre><code class="language-cpp">std::vector&lt;Fahrzeug*&gt; v;
v.push_back( new Auto(&quot;Golf GTI Ich hab keine Ahnung von Autos&quot;) );
</code></pre>
<p>Dann wird die virtuelle Methode, wenn sie in Auto überschrieben wurde, auch in Auto aufgerufen (also die, die in Auto definiert wurde und nicht die in der Basisklasse).</p>
<p>Hol dir ein gutes Buch, Thread gibts im Forum.</p>
<p>Versuch am besten aus Fahrzeug eine <em>abstrakte</em> Basisklasse zu machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2228540</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228540</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Fri, 29 Jun 2012 18:39:21 GMT</pubDate></item><item><title><![CDATA[Reply to Vector von Basisklasse und Aufruf virtueller Funktionen on Fri, 29 Jun 2012 18:47:11 GMT]]></title><description><![CDATA[<p>Kellerautomat schrieb:</p>
<blockquote>
<p>Das Problem bei Zeigern im Vector ist nämlich dass der Vector die Objekte hinter den Zeigern nicht automatisch mitlöscht. Dazu dient unique_ptr. Genaueres schlägst du am besten nach. <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>
</blockquote>
<p>Dann kann er gleich <code>boost::ptr_vector</code> nehmen <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/2228542</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228542</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Fri, 29 Jun 2012 18:47:11 GMT</pubDate></item><item><title><![CDATA[Reply to Vector von Basisklasse und Aufruf virtueller Funktionen on Fri, 29 Jun 2012 19:10:32 GMT]]></title><description><![CDATA[<p>jule86 schrieb:</p>
<blockquote>
<p>Ich komme aus der Java Welt und stolpere über ein wahrscheinlich triviales C++ Problem.</p>
<pre><code class="language-cpp">for(vector&lt;Fahrzeug&gt;::iterator i = v.begin(); i != v.end(); ++i) {
    (*i).print();
}
</code></pre>
</blockquote>
<p>Da muss man dich loben. Die meisten, die von Java kommen, halten großen Abstand von der STL und handeln sich dadurch nur Probleme ein.</p>
<p>Es wird immer eine Kopie des Objekts in den <code>vector</code> eingefügt.</p>
<pre><code class="language-cpp">Auto a;
Fahrzeug f = a;
</code></pre>
<p>Bei der Kopie <code>f = a</code> werden natürlich nur <code>Fahrzeug</code> -Informationen, die <code>a</code> hat, kopiert (alles andere wäre auch sehr unlogisch). Damit ist dir hoffentlich auch klar, warum immer die print-Methode von <code>Fahrzeug</code> aufgerufen wird.<br />
Lösung: Referenzen oder Zeiger verwenden. Referenzen kann ein Container nicht aufnehmen, damit bleiben dir nur noch die Zeiger. Beim Einfügen in den <code>vector</code> wird dann der Zeiger kopiert. Das eigentliche Objekt bekommt von alldem nichts mit. Da deine Klassen polymorph sind, wird dann je nach Datentyp des Pointees die entsprechende Methode aufgerufen, genauso, wie du es dir erwartet hast.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;iterator&gt;
#include &lt;vector&gt;
using namespace std;

class Fahrzeug
{
	public:
		virtual void print() = 0;
};

class Auto : public Fahrzeug
{
	public:
		virtual void print()
		{
			cout &lt;&lt; '\n' &lt;&lt; &quot;Auto&quot;;
		}
};
class LKW : public Fahrzeug
{
	public:
		virtual void print()
		{
			cout &lt;&lt; '\n' &lt;&lt; &quot;LKW&quot;;
		}
};
class Motorrad : public Fahrzeug
{
	public:
		virtual void print()
		{
			cout &lt;&lt; '\n' &lt;&lt; &quot;Motorrad&quot;;
		}
};

int main()
{
	vector&lt;Fahrzeug*&gt; fahrzeuge;

	Auto a;
	LKW l;
	Motorrad m;

	fahrzeuge.push_back(&amp;a);
	fahrzeuge.push_back(&amp;l);
	fahrzeuge.push_back(&amp;m);

	for(vector&lt;Fahrzeug*&gt;::iterator it=fahrzeuge.begin(); it!=fahrzeuge.end(); ++it)
	{
		(*it)-&gt;print();
	}

	return 0;
}
</code></pre>
<p>Siehe auch: <a href="http://stackoverflow.com/questions/2394581/pure-virtual-class-and-collections-vector" rel="nofollow">http://stackoverflow.com/questions/2394581/pure-virtual-class-and-collections-vector</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2228545</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228545</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 29 Jun 2012 19:10:32 GMT</pubDate></item><item><title><![CDATA[Reply to Vector von Basisklasse und Aufruf virtueller Funktionen on Sat, 30 Jun 2012 10:50:35 GMT]]></title><description><![CDATA[<p>Gugelmoser schrieb:</p>
<blockquote>
<pre><code class="language-cpp">class Fahrzeug
{
	public:
		virtual void print() = 0;
};
</code></pre>
</blockquote>
<p>Da fehlt ein virtueller Destruktor, falls der Vektor die Objekte besitzen und korrekt zerstören soll.</p>
<pre><code class="language-cpp">class Fahrzeug
{
	public:
		virtual ~Fahrzeug() {}
		virtual void print() = 0;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2228641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228641</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Sat, 30 Jun 2012 10:50:35 GMT</pubDate></item><item><title><![CDATA[Reply to Vector von Basisklasse und Aufruf virtueller Funktionen on Sat, 30 Jun 2012 10:59:09 GMT]]></title><description><![CDATA[<blockquote>
<p>Da fehlt ein virtueller Destruktor, falls der Vektor die Objekte besitzen und korrekt zerstören soll.</p>
</blockquote>
<p>Und falls nicht, tut man gut daran den Destruktor non-virtual protected zu machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2228643</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228643</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Sat, 30 Jun 2012 10:59:09 GMT</pubDate></item></channel></rss>