<?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[Hilfe zu polymorphie Aufgabe]]></title><description><![CDATA[<p>Hiho,</p>
<p>Ich bin grad dabei alte Klausuren für kommende Informatik Klausur zu lösen. Doch bei einer Aufgabe kann ich mir das resultat im Compiler einfach nicht erklären.</p>
<pre><code class="language-cpp">class A 
{ 
protected: 
     string name; 
public: 
     A(string name=&quot;NN&quot;) : name(name) {}; 
     virtual string getName() const 
     {    return &quot;A::getName: name = &quot; + name;   } 
     virtual void print(bool nl=true) const 
     { 
          if (nl) cout &lt;&lt; &quot;A::print - &quot;; 
          cout &lt;&lt; getName();    
          if (nl) cout &lt;&lt; endl;              
     } 
}; 

class B : virtual public A  
{ 
     string b; 
public: 
     B(string name, string b=&quot;B&quot;) : A(name), b(b) {}; 
     virtual void print(bool nl=true) const 
     { 
          if (nl) cout &lt;&lt; &quot;B::print - &quot;; 
          A::print(false); 
          cout &lt;&lt; &quot;, b=&quot; &lt;&lt; b;  
          if (nl) cout &lt;&lt; endl; 
     } 
}; 

class C : public B  
{    string c; 
public: 
     C(string name, string c=&quot;C&quot;, string b=&quot;B&quot;)  : B(name,b), c(c) {}; 
     string getName() const 
     {    return &quot;C::getName: name = &quot; + name;   } 
     virtual void print(bool nl=true) 
     { 
          if (nl) cout &lt;&lt; &quot;C::print - &quot;; 
          B::print(false); 
          cout &lt;&lt; &quot;, c=&quot; &lt;&lt; c;  
          if (nl) cout &lt;&lt; endl; 
     } 
}; 

int main() 
{ 
     C c(&quot;C-Obj&quot;);             
     C * cptr = &amp;c;           
     ((A*)(cptr))-&gt;print();      //ruft print() aus Klasse B auf
     return 0;            
}
</code></pre>
<p>In der dritten Zeile der Main wird das Print() der Klasse B aufgerufen aber warum?<br />
Ich dachte der Cast davor ist egal weil eh in der Virtuellen Tabelle geschaut wird und dann das Print von C aufgerufen wird. Aber dem scheint nicht so zu sein <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="😞"
    /><br />
Dazu kommt noch das die Print Methoden von A und B const sind im Gegensatz zur Print von C. Da const zur Signatur zählt kann es doch überhaupt nicht sein, dass das Print von B aufgerufen wird. Ich bin verwirrt <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>
<p>MFG Fy</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/289377/hilfe-zu-polymorphie-aufgabe</link><generator>RSS for Node</generator><lastBuildDate>Wed, 19 Aug 2026 05:44:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/289377.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 03 Jul 2011 19:03:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Hilfe zu polymorphie Aufgabe on Sun, 03 Jul 2011 19:03:11 GMT]]></title><description><![CDATA[<p>Hiho,</p>
<p>Ich bin grad dabei alte Klausuren für kommende Informatik Klausur zu lösen. Doch bei einer Aufgabe kann ich mir das resultat im Compiler einfach nicht erklären.</p>
<pre><code class="language-cpp">class A 
{ 
protected: 
     string name; 
public: 
     A(string name=&quot;NN&quot;) : name(name) {}; 
     virtual string getName() const 
     {    return &quot;A::getName: name = &quot; + name;   } 
     virtual void print(bool nl=true) const 
     { 
          if (nl) cout &lt;&lt; &quot;A::print - &quot;; 
          cout &lt;&lt; getName();    
          if (nl) cout &lt;&lt; endl;              
     } 
}; 

class B : virtual public A  
{ 
     string b; 
public: 
     B(string name, string b=&quot;B&quot;) : A(name), b(b) {}; 
     virtual void print(bool nl=true) const 
     { 
          if (nl) cout &lt;&lt; &quot;B::print - &quot;; 
          A::print(false); 
          cout &lt;&lt; &quot;, b=&quot; &lt;&lt; b;  
          if (nl) cout &lt;&lt; endl; 
     } 
}; 

class C : public B  
{    string c; 
public: 
     C(string name, string c=&quot;C&quot;, string b=&quot;B&quot;)  : B(name,b), c(c) {}; 
     string getName() const 
     {    return &quot;C::getName: name = &quot; + name;   } 
     virtual void print(bool nl=true) 
     { 
          if (nl) cout &lt;&lt; &quot;C::print - &quot;; 
          B::print(false); 
          cout &lt;&lt; &quot;, c=&quot; &lt;&lt; c;  
          if (nl) cout &lt;&lt; endl; 
     } 
}; 

int main() 
{ 
     C c(&quot;C-Obj&quot;);             
     C * cptr = &amp;c;           
     ((A*)(cptr))-&gt;print();      //ruft print() aus Klasse B auf
     return 0;            
}
</code></pre>
<p>In der dritten Zeile der Main wird das Print() der Klasse B aufgerufen aber warum?<br />
Ich dachte der Cast davor ist egal weil eh in der Virtuellen Tabelle geschaut wird und dann das Print von C aufgerufen wird. Aber dem scheint nicht so zu sein <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="😞"
    /><br />
Dazu kommt noch das die Print Methoden von A und B const sind im Gegensatz zur Print von C. Da const zur Signatur zählt kann es doch überhaupt nicht sein, dass das Print von B aufgerufen wird. Ich bin verwirrt <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>
<p>MFG Fy</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2088332</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2088332</guid><dc:creator><![CDATA[Fy]]></dc:creator><pubDate>Sun, 03 Jul 2011 19:03:11 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe zu polymorphie Aufgabe on Sun, 03 Jul 2011 19:09:28 GMT]]></title><description><![CDATA[<p>Fy schrieb:</p>
<blockquote>
<p>Dazu kommt noch das die Print Methoden von A und B const sind im Gegensatz zur Print von C. Da const zur Signatur zählt kann es doch überhaupt nicht sein, dass das Print von B aufgerufen wird. Ich bin verwirrt <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>
</blockquote>
<p>Doch, genau das dürfte der Grund sein, warum die Methode von B aufgerufen wird. B::print() hat die selbe Signatur wie A::print() und wird deshalb virtuell aufgerufen, C::print() hat eine andere Signatur und gilt deshalb als eigenständige Funktion.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2088336</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2088336</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sun, 03 Jul 2011 19:09:28 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe zu polymorphie Aufgabe on Sun, 03 Jul 2011 19:10:54 GMT]]></title><description><![CDATA[<p>Das print von C ist ein anderes als das von A und B, wegen dem Fehlen von <code>const</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2088337</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2088337</guid><dc:creator><![CDATA[fdfdg]]></dc:creator><pubDate>Sun, 03 Jul 2011 19:10:54 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe zu polymorphie Aufgabe on Sun, 03 Jul 2011 19:44:42 GMT]]></title><description><![CDATA[<p>Warum wird dann nicht das Print von A aufgerufen? Der Up-Cast geht ja auf A.<br />
Oder wird nur in die VTabelle geschaut und der Cast ignoriert? Aber wie kommt Die Tabelle dann auf B::print()?</p>
<p>Dass das Objekt nicht const ist aber eine const Methode aufruft ist dann egal?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2088352</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2088352</guid><dc:creator><![CDATA[Fy]]></dc:creator><pubDate>Sun, 03 Jul 2011 19:44:42 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe zu polymorphie Aufgabe on Sun, 03 Jul 2011 19:50:22 GMT]]></title><description><![CDATA[<p>Fy schrieb:</p>
<blockquote>
<p>Warum wird dann nicht das Print von A aufgerufen? Der Up-Cast geht ja auf A.<br />
Oder wird nur in die VTabelle geschaut und der Cast ignoriert? Aber wie kommt Die Tabelle dann auf B::print()?</p>
</blockquote>
<p>Bei virtuellen Methoden wird die Version der Klasse aufgerufen, die sie als letztes in der Hierarchie überschrieben hat (anhand der vtable) - und das ist in deinem Fall B (der Cast sorgt nur dafür, daß die von C definierte Funktion nicht mehr zur Verfügung steht, die hat einen eigenen Eintrag in der vtable).</p>
<p>PS: Klar darfst du für ein nicht-konstantes Objekt eine konstante Methode aufrufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2088355</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2088355</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sun, 03 Jul 2011 19:50:22 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe zu polymorphie Aufgabe on Sun, 03 Jul 2011 19:57:36 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Fy schrieb:</p>
<blockquote>
<p>Warum wird dann nicht das Print von A aufgerufen? Der Up-Cast geht ja auf A.<br />
Oder wird nur in die VTabelle geschaut und der Cast ignoriert? Aber wie kommt Die Tabelle dann auf B::print()?</p>
</blockquote>
<p>Bei virtuellen Methoden wird die Version der Klasse aufgerufen, die sie als letztes in der Hierarchie überschrieben hat (anhand der vtable) - und das ist in deinem Fall B (der Cast sorgt nur dafür, daß die von C definierte Funktion nicht mehr zur Verfügung steht, die hat einen eigenen Eintrag in der vtable).</p>
<p>PS: Klar darfst du für ein nicht-konstantes Objekt eine konstante Methode aufrufen.</p>
</blockquote>
<p>Ah jetzt hab ichs verstanden. Vielen Dank <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/2088363</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2088363</guid><dc:creator><![CDATA[Fy]]></dc:creator><pubDate>Sun, 03 Jul 2011 19:57:36 GMT</pubDate></item></channel></rss>