<?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[[gelöst] Verständnisproblem mit virtual]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hab bei virtual gelesen, dass es den Compliler anweist immer die Funktion aus der zugehörigen Klasse zu nehmen. Und das klappt nur, wenn es über Pointer aufgerufen wird.<br />
Folgendes habe ich programmiert: (hier kurz als Schema)</p>
<pre><code>class A
{
protected:
  int whoami;
public:
  A();
  A(int m_type);
  virtual void ShowMe();
}

class B : public A
{
  B();
  B(int m_type);
  virtual void ShowMe();
}

A::A() {whoami = 0; ShowMe(); }
A::A(int m_type) {whoami = m_type; ShowMe(); }
A::ShowMe() { cout &lt;&lt; &quot;Von A: &quot; &lt;&lt; whoami; }

B::B() : A() {}
B::B(int m_type) : A(m_type) {}
B::ShowMe() { cout &lt;&lt; &quot;Von B: &quot; &lt;&lt; whoami; }
</code></pre>
<p>Es passiert natürlich noch viel mehr in meiner Klasse, aber das ist der wesentliche Problemteil.</p>
<pre><code>main()
{
  A* pMeins = new B(1); // Ausgabe: &quot;Von A: 1&quot;
  delete pMains;
}
</code></pre>
<p>Wenn ich virtual richtig verstanden habe, dann müsste doch dort &quot;Von B: 1&quot; stehen und nicht &quot;Von A: 1&quot;, oder? Denn die Funktion ShowMe() ist virtual.</p>
<p>Was verstehe ich falsch?<br />
Danke,<br />
Stefan</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/237743/gelöst-verständnisproblem-mit-virtual</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 09:33:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/237743.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 01 Apr 2009 09:44:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [gelöst] Verständnisproblem mit virtual on Wed, 01 Apr 2009 09:52:21 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hab bei virtual gelesen, dass es den Compliler anweist immer die Funktion aus der zugehörigen Klasse zu nehmen. Und das klappt nur, wenn es über Pointer aufgerufen wird.<br />
Folgendes habe ich programmiert: (hier kurz als Schema)</p>
<pre><code>class A
{
protected:
  int whoami;
public:
  A();
  A(int m_type);
  virtual void ShowMe();
}

class B : public A
{
  B();
  B(int m_type);
  virtual void ShowMe();
}

A::A() {whoami = 0; ShowMe(); }
A::A(int m_type) {whoami = m_type; ShowMe(); }
A::ShowMe() { cout &lt;&lt; &quot;Von A: &quot; &lt;&lt; whoami; }

B::B() : A() {}
B::B(int m_type) : A(m_type) {}
B::ShowMe() { cout &lt;&lt; &quot;Von B: &quot; &lt;&lt; whoami; }
</code></pre>
<p>Es passiert natürlich noch viel mehr in meiner Klasse, aber das ist der wesentliche Problemteil.</p>
<pre><code>main()
{
  A* pMeins = new B(1); // Ausgabe: &quot;Von A: 1&quot;
  delete pMains;
}
</code></pre>
<p>Wenn ich virtual richtig verstanden habe, dann müsste doch dort &quot;Von B: 1&quot; stehen und nicht &quot;Von A: 1&quot;, oder? Denn die Funktion ShowMe() ist virtual.</p>
<p>Was verstehe ich falsch?<br />
Danke,<br />
Stefan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1689178</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1689178</guid><dc:creator><![CDATA[stefanjann]]></dc:creator><pubDate>Wed, 01 Apr 2009 09:52:21 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Verständnisproblem mit virtual on Wed, 01 Apr 2009 09:51:05 GMT]]></title><description><![CDATA[<blockquote>
<p>ich hab bei virtual gelesen, dass es den Compliler anweist immer die Funktion aus der zugehörigen Klasse zu nehmen. Und das klappt nur, wenn es über Pointer aufgerufen wird.</p>
</blockquote>
<p>Auch bei Referenzen funnktionierts.</p>
<p>Du darfst die virtuellen Methoden erst Aufrufen, wenn das Objekt vollständig konstruiert ist. Konkret: Wenn bei Dir A konstruiert ist, und Du ShowMe() aufrufst, gibt es B noch gar nicht.</p>
<p>Simon</p>
<p>Edit: z.B. so:</p>
<pre><code class="language-cpp">main() 
{ 
  A* pMeins = new B(1); // Ausgabe: &quot;Von A: 1&quot; 
  pMeins-&gt;ShowMe();
  delete pMains; 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1689180</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1689180</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Wed, 01 Apr 2009 09:51:05 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Verständnisproblem mit virtual on Wed, 01 Apr 2009 09:51:49 GMT]]></title><description><![CDATA[<p>Danke schön,<br />
das erklärt natürlich warums nicht so läuft wie ich das will.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1689183</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1689183</guid><dc:creator><![CDATA[stefanjann]]></dc:creator><pubDate>Wed, 01 Apr 2009 09:51:49 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Verständnisproblem mit virtual on Wed, 01 Apr 2009 09:54:06 GMT]]></title><description><![CDATA[<p>stefanjann schrieb:</p>
<blockquote>
<p>ich hab bei virtual gelesen, dass es den Compliler anweist immer die Funktion aus der zugehörigen Klasse zu nehmen. Und das klappt nur, wenn es über Pointer aufgerufen wird.</p>
</blockquote>
<p>Rufe <strong>niemals</strong> virtuelle Funktionen aus Konstruktoren auf (es sei den du bist der Konsequenzen wirklich bewusst).</p>
<p>In Vererbungshierarchien wird immer zuerst von der Basisklasse aus die Konstruktoren ausgeführt. In deinen Beispiel wird bei einer Erstellung einer Klasse B, erst der A-Anteil konstruiert, dann der B-Anteil. Somit &quot;sieht&quot; der Konstruktor nur die A-Umsetzung der virtuellen Funktion.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1689184</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1689184</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Wed, 01 Apr 2009 09:54:06 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Verständnisproblem mit virtual on Wed, 01 Apr 2009 09:59:03 GMT]]></title><description><![CDATA[<p>die virtuelle funktion der basis klasse muss in der abgeleiteten klasse gleich heißen!</p>
<p>Und in deiner main-Methode ist ja doch gar kein Aufruf der ShowMe()-Methode über den Pointer deiner Basisklasse A.<br />
Du rufst ShowMe auch in der Klasse A auf.<br />
1. nimmt er dann die eigene Klassenmethode, also aus A.<br />
2. (wahrscheinlich, was du möchtest) kennt die Klasse A doch gar nicht die Funktion der Klasse B! Selbst mit dem Scope-Operator der Klasse B würdest du einen Fehler bekommen.</p>
<p>(leider ohne cpp-tags)</p>
<p>class A{<br />
virtual void showme();<br />
};</p>
<p>class B : public A{<br />
void showme();<br />
}<br />
-------------------------------------</p>
<p>B myB();</p>
<p>A *myA = &amp;myB;<br />
myA-&gt;showme();</p>
<p>Ich hoffe, ich konnte dir auf die schnelle helfen <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="😉"
    /><br />
Ansonsten google mal nach Polymorphimus.</p>
<p>Gruß Sdy</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1689187</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1689187</guid><dc:creator><![CDATA[sheddy]]></dc:creator><pubDate>Wed, 01 Apr 2009 09:59:03 GMT</pubDate></item></channel></rss>