<?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[Virtuelle Methoden und STL Container?]]></title><description><![CDATA[<p>Hallo allerseits,</p>
<p>folgender Code kompiliert nicht:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;

using namespace std;

class A
{
public:
  virtual void ausgabe() const = 0;
};

class B : public A
{
public:
  void ausgabe() const {cout &lt;&lt; &quot;Ausgabe Klasse B\n&quot;;}
};

class C : public A
{
public:
  void ausgabe() const {cout &lt;&lt; &quot;Ausgabe Klasse C\n&quot;;}
};

int main()
{
  vector&lt;A&gt; vecA;
  vecA.push_back(B());
  vecA.push_back(C());

  for(int i=0, j=vecA.size(); i&lt;j; ++i)
  {
    vecA.at(i).ausgabe();
  }
}
</code></pre>
<p>Die Sache ist klar: Da Klasse A rein virtuell ist kann der Vektor nicht funktionieren.</p>
<p>Mein Problem ist, wie bekomme ich es hin dass:</p>
<p>1. Objekte der Klassen B und C (die eine gemeinsame Basisklasse haben - nämlich A) die Methode ausgabe() von Klasse A überschreiben</p>
<p>UND</p>
<p>2. in ein und demselben Vektor (nämlich vector&lt;A&gt;) landen</p>
<p>UND</p>
<p>3. bei Aufruf der Methode ausgabe() der Objekte im Vektor die korrekte Ausgabe folgt (nämlich &quot;Ausgabe Klasse B&quot; und &quot;Ausgabe Klasse C&quot;)</p>
<p>Danke und Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/256596/virtuelle-methoden-und-stl-container</link><generator>RSS for Node</generator><lastBuildDate>Fri, 11 Sep 2026 06:04:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/256596.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 15 Dec 2009 12:01:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Virtuelle Methoden und STL Container? on Tue, 15 Dec 2009 12:01:54 GMT]]></title><description><![CDATA[<p>Hallo allerseits,</p>
<p>folgender Code kompiliert nicht:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;

using namespace std;

class A
{
public:
  virtual void ausgabe() const = 0;
};

class B : public A
{
public:
  void ausgabe() const {cout &lt;&lt; &quot;Ausgabe Klasse B\n&quot;;}
};

class C : public A
{
public:
  void ausgabe() const {cout &lt;&lt; &quot;Ausgabe Klasse C\n&quot;;}
};

int main()
{
  vector&lt;A&gt; vecA;
  vecA.push_back(B());
  vecA.push_back(C());

  for(int i=0, j=vecA.size(); i&lt;j; ++i)
  {
    vecA.at(i).ausgabe();
  }
}
</code></pre>
<p>Die Sache ist klar: Da Klasse A rein virtuell ist kann der Vektor nicht funktionieren.</p>
<p>Mein Problem ist, wie bekomme ich es hin dass:</p>
<p>1. Objekte der Klassen B und C (die eine gemeinsame Basisklasse haben - nämlich A) die Methode ausgabe() von Klasse A überschreiben</p>
<p>UND</p>
<p>2. in ein und demselben Vektor (nämlich vector&lt;A&gt;) landen</p>
<p>UND</p>
<p>3. bei Aufruf der Methode ausgabe() der Objekte im Vektor die korrekte Ausgabe folgt (nämlich &quot;Ausgabe Klasse B&quot; und &quot;Ausgabe Klasse C&quot;)</p>
<p>Danke und Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1822759</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822759</guid><dc:creator><![CDATA[goran]]></dc:creator><pubDate>Tue, 15 Dec 2009 12:01:54 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Methoden und STL Container? on Tue, 15 Dec 2009 12:08:13 GMT]]></title><description><![CDATA[<p>OK, mit Pointern funktionierts:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;

using namespace std;

class A
{
public:
  virtual void ausgabe() const = 0;
};

class B : public A
{
public:
  void ausgabe() const {cout &lt;&lt; &quot;Ausgabe Klasse B\n&quot;;}
};

class C : public A
{
public:
  void ausgabe() const {cout &lt;&lt; &quot;Ausgabe Klasse C\n&quot;;}
};

int main()
{
  vector&lt;A*&gt; vecA;
  vecA.push_back(new B());
  vecA.push_back(new C());

  for(int i=0, j=vecA.size(); i&lt;j; ++i)
  {
    vecA.at(i)-&gt;ausgabe();
    delete vecA.at(i);
  }
}
</code></pre>
<p>Warum?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1822767</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822767</guid><dc:creator><![CDATA[goran]]></dc:creator><pubDate>Tue, 15 Dec 2009 12:08:13 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Methoden und STL Container? on Tue, 15 Dec 2009 12:45:02 GMT]]></title><description><![CDATA[<p>Kurz gesagt: Du hast gerade Polymorphie entdeckt.</p>
<p>Das man keine Objekte einer abstrakten Klasse anlegen kann, weißt du ja schon. Gegen Zeiger auf diese Objekte spricht aber an sich nichts. Technisch wird dabei (meistens) ein sogenannter VTable angelegt, der dafür sorgt, dass am Ende die richtigen Methoden ausgerufen werden:<br />
<a href="http://de.wikipedia.org/wiki/Tabelle_virtueller_Methoden" rel="nofollow">http://de.wikipedia.org/wiki/Tabelle_virtueller_Methoden</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1822792</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822792</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 15 Dec 2009 12:45:02 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Methoden und STL Container? on Tue, 15 Dec 2009 13:28:37 GMT]]></title><description><![CDATA[<p>goran schrieb:</p>
<blockquote>
<p>OK, mit Pointern funktionierts:<br />
...<br />
Warum?</p>
</blockquote>
<p>Vielleicht noch etwas weiterführende Erklärung (kann es sein das du von C# oder Java kommst, die zwar alltäglich Zeiger verwenden, aber es vor dem Programmierer verbergen?):</p>
<blockquote>
<blockquote>
<p>&gt; ACHTUNG VEREINFACHTE DARSTELLUNG &lt;&lt;&lt;</p>
</blockquote>
</blockquote>
<p>Wenn du eine Klasse A hast, und eine Klasse B, die von A abgeleitet ist, stellen sich Objekte dieser Typen vereinfacht wie folgt im Speicher dar.</p>
<pre><code>A a;                    B b;
[A spezifischer Teil]   [A spezifischer Teil]
                        [B spezifischer Teil]
</code></pre>
<p>Sprich ein Objekt besteht im Speicher aus seinen Teilen, sowie allen Teilen der Klassen von dem es abgeleitet ist. Wenn du nun ein Objekt des Types B einen des Types A zuweist, &quot;schneidest&quot; du Teile ab.</p>
<pre><code>a = b;
[A spezifischer Teil] &lt;== [A spezifischer Teil]
                       x  [B spezifischer Teil] =&gt; wird nicht übertragen
</code></pre>
<p>Zeiger und Referenzen verhalten sich hier anders, da du hier keine Objekte kopierst. Beide verweisen auf den Objektanfang.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1822827</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822827</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 15 Dec 2009 13:28:37 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Methoden und STL Container? on Tue, 15 Dec 2009 13:51:41 GMT]]></title><description><![CDATA[<p>Besten Dank für alle Antworten.</p>
<blockquote>
<p>Zeiger und Referenzen verhalten sich hier anders, da du hier keine Objekte kopierst. Beide verweisen auf den Objektanfang.</p>
</blockquote>
<p>Ahh...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1822840</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822840</guid><dc:creator><![CDATA[goran]]></dc:creator><pubDate>Tue, 15 Dec 2009 13:51:41 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Methoden und STL Container? on Tue, 15 Dec 2009 14:05:21 GMT]]></title><description><![CDATA[<p>goran schrieb:</p>
<blockquote>
<p>Besten Dank für alle Antworten.</p>
<blockquote>
<p>Zeiger und Referenzen verhalten sich hier anders, da du hier keine Objekte kopierst. Beide verweisen auf den Objektanfang.</p>
</blockquote>
<p>Ahh...</p>
</blockquote>
<p>Nimm es aber nicht zu wörtlich. Zeiger verweisen tatsächlich auf die Startadresse, Referenzen können - müssen aber nicht - intern Zeiger sein (ggf. werden sie gänzlich wegoptimiert). Wie gesagt ist dies eine vereinfachte Darstellung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1822853</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822853</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 15 Dec 2009 14:05:21 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Methoden und STL Container? on Tue, 15 Dec 2009 16:09:48 GMT]]></title><description><![CDATA[<p>Hm... kann das nicht gefährlich werden? Ich erinnere mich da an:<br />
Richtlinie 3: Behandle Vektoren niemals polymorph.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1822964</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822964</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Tue, 15 Dec 2009 16:09:48 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Methoden und STL Container? on Tue, 15 Dec 2009 16:20:42 GMT]]></title><description><![CDATA[<p>Ad aCTa schrieb:</p>
<blockquote>
<p>Hm... kann das nicht gefährlich werden? Ich erinnere mich da an:<br />
Richtlinie 3: Behandle Vektoren niemals polymorph.</p>
</blockquote>
<p>Nein, damit ist ganz was anderes gemeint. Dabei geht es um die Verwendung von Vektoren einer abgeleiteten Klasse als Vektor einer Basisklasse. Das geht (genauso wie bei Arrays) selbstverständlich schief.</p>
<p>Die Verwendung von Vektoren von Zeigern auf Objekte einer Basisklasse ist aber genau die Art und Weise wie Polymorphie vorgesehen ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1822978</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822978</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 15 Dec 2009 16:20:42 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Methoden und STL Container? on Tue, 15 Dec 2009 16:30:41 GMT]]></title><description><![CDATA[<p>Ah ja, stimmt, das sind ja Zeiger-Arrays. :xmas2:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1822997</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822997</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Tue, 15 Dec 2009 16:30:41 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Methoden und STL Container? on Tue, 15 Dec 2009 18:31:40 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Die Verwendung von Vektoren von Zeigern auf Objekte einer Basisklasse ist aber genau die Art und Weise wie Polymorphie vorgesehen ist.</p>
</blockquote>
<p>...mal abgesehen davon, dass es in Hinblick auf Exceptionsicherheit und automatischer Speicherverwaltung bestimmt bessere Möglichkeiten als rohe, besitzende Zeiger in STL-Containern gibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1823075</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1823075</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 15 Dec 2009 18:31:40 GMT</pubDate></item></channel></rss>