<?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[Frage zu dynamic_cast]]></title><description><![CDATA[<p>Hi</p>
<pre><code class="language-cpp">class A {
  public:
    A () {cerr &lt;&lt; &quot; Ich bin ein A!&quot; &lt;&lt; endl;}
    void Call() {cerr &lt;&lt; &quot; Ich bin ein A-Call!&quot; &lt;&lt; endl;}
    };

class B: public A {
  public:
    B () {cerr &lt;&lt; &quot;  Ich bin ein B!&quot; &lt;&lt; endl;}
    void Call() {cerr &lt;&lt; &quot;  Ich bin ein B-Call!&quot; &lt;&lt; endl;}
    };

class C: public B {
  public:
    C () {cerr &lt;&lt; &quot;   Ich bin ein C!&quot; &lt;&lt; endl;}
    void Call() {cerr &lt;&lt; &quot;   Ich bin ein C-Call!&quot; &lt;&lt; endl;}
    };

void Test1() {

    cerr &lt;&lt; &quot;test1!&quot; &lt;&lt; endl;

    cerr &lt;&lt; &quot;A!&quot; &lt;&lt; endl;
    A my_a;
    cerr &lt;&lt; endl;

    cerr &lt;&lt; &quot;B!&quot; &lt;&lt; endl;
    B my_b;
    cerr &lt;&lt; endl;

    cerr &lt;&lt; &quot;C!&quot; &lt;&lt; endl;
    C my_c;
    cerr &lt;&lt; endl;

    A* my_a_ptr = 0;
    B* my_b_ptr = 0;
    C* my_c_ptr = 0;

    my_a_ptr = &amp;my_a;
    cerr &lt;&lt; &quot;my_a_ptr&quot; &lt;&lt; endl;
    my_a_ptr-&gt;Call();

    my_c_ptr = &amp;my_c;
    cerr &lt;&lt; &quot;my_c_ptr&quot; &lt;&lt; endl;
    my_c_ptr-&gt;Call();

    my_b_ptr = &amp;my_b;
    cerr &lt;&lt; &quot;my_b_ptr&quot; &lt;&lt; endl;
    my_b_ptr-&gt;Call();

    my_a_ptr = new B();
    cerr &lt;&lt; &quot;my_a_ptr = new B()&quot; &lt;&lt; endl;
    my_a_ptr-&gt;Call();

    my_b_ptr = dynamic_cast&lt;B*&gt; (my_a_ptr);
    my_b_ptr-&gt;Call();

    }
</code></pre>
<p>fuehrt zu</p>
<p>test1.cpp:xx: error: cannot dynamic_cast ‘my_a_ptr’ (of type ‘class A*’) to type ‘class B*’ (source type is not polymorphic)</p>
<p>ersetzt man das ganze durch einen static_cast klappt alles wie gewuenscht ...<br />
wieso ist das so?</p>
<p>Gruesse</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/172680/frage-zu-dynamic_cast</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 00:21:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/172680.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 07 Feb 2007 14:48:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu dynamic_cast on Wed, 07 Feb 2007 14:48:59 GMT]]></title><description><![CDATA[<p>Hi</p>
<pre><code class="language-cpp">class A {
  public:
    A () {cerr &lt;&lt; &quot; Ich bin ein A!&quot; &lt;&lt; endl;}
    void Call() {cerr &lt;&lt; &quot; Ich bin ein A-Call!&quot; &lt;&lt; endl;}
    };

class B: public A {
  public:
    B () {cerr &lt;&lt; &quot;  Ich bin ein B!&quot; &lt;&lt; endl;}
    void Call() {cerr &lt;&lt; &quot;  Ich bin ein B-Call!&quot; &lt;&lt; endl;}
    };

class C: public B {
  public:
    C () {cerr &lt;&lt; &quot;   Ich bin ein C!&quot; &lt;&lt; endl;}
    void Call() {cerr &lt;&lt; &quot;   Ich bin ein C-Call!&quot; &lt;&lt; endl;}
    };

void Test1() {

    cerr &lt;&lt; &quot;test1!&quot; &lt;&lt; endl;

    cerr &lt;&lt; &quot;A!&quot; &lt;&lt; endl;
    A my_a;
    cerr &lt;&lt; endl;

    cerr &lt;&lt; &quot;B!&quot; &lt;&lt; endl;
    B my_b;
    cerr &lt;&lt; endl;

    cerr &lt;&lt; &quot;C!&quot; &lt;&lt; endl;
    C my_c;
    cerr &lt;&lt; endl;

    A* my_a_ptr = 0;
    B* my_b_ptr = 0;
    C* my_c_ptr = 0;

    my_a_ptr = &amp;my_a;
    cerr &lt;&lt; &quot;my_a_ptr&quot; &lt;&lt; endl;
    my_a_ptr-&gt;Call();

    my_c_ptr = &amp;my_c;
    cerr &lt;&lt; &quot;my_c_ptr&quot; &lt;&lt; endl;
    my_c_ptr-&gt;Call();

    my_b_ptr = &amp;my_b;
    cerr &lt;&lt; &quot;my_b_ptr&quot; &lt;&lt; endl;
    my_b_ptr-&gt;Call();

    my_a_ptr = new B();
    cerr &lt;&lt; &quot;my_a_ptr = new B()&quot; &lt;&lt; endl;
    my_a_ptr-&gt;Call();

    my_b_ptr = dynamic_cast&lt;B*&gt; (my_a_ptr);
    my_b_ptr-&gt;Call();

    }
</code></pre>
<p>fuehrt zu</p>
<p>test1.cpp:xx: error: cannot dynamic_cast ‘my_a_ptr’ (of type ‘class A*’) to type ‘class B*’ (source type is not polymorphic)</p>
<p>ersetzt man das ganze durch einen static_cast klappt alles wie gewuenscht ...<br />
wieso ist das so?</p>
<p>Gruesse</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1224477</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1224477</guid><dc:creator><![CDATA[Frager]]></dc:creator><pubDate>Wed, 07 Feb 2007 14:48:59 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu dynamic_cast on Wed, 07 Feb 2007 15:03:56 GMT]]></title><description><![CDATA[<p>Gleich noch eine hinterher</p>
<pre><code class="language-cpp">cerr &lt;&lt; &quot;my_a_ptr = new B()&quot; &lt;&lt; endl;
    my_a_ptr = new B();
    my_a_ptr-&gt;Call();
    cerr &lt;&lt; endl;

    cerr &lt;&lt; &quot;my_b_ptr = static_cast&lt;B*&gt; (my_a_ptr)&quot; &lt;&lt; endl;
    my_b_ptr = static_cast&lt;B*&gt; (my_a_ptr);
    my_b_ptr-&gt;Call();
    cerr &lt;&lt; endl;

    cerr &lt;&lt; &quot;my_c_ptr = static_cast&lt;C*&gt; (my_a_ptr)&quot; &lt;&lt; endl;
    my_c_ptr = static_cast&lt;C*&gt; (my_a_ptr);
    my_c_ptr-&gt;Call();
    cerr &lt;&lt; endl;
</code></pre>
<p>fuehrt zu:</p>
<p>my_a_ptr = new B()<br />
Ich bin ein A!<br />
Ich bin ein B!<br />
Ich bin ein A-Call!</p>
<p>my_b_ptr = static_cast&lt;B*&gt; (my_a_ptr)<br />
Ich bin ein B-Call!</p>
<p>my_c_ptr = static_cast&lt;C*&gt; (my_a_ptr)<br />
Ich bin ein C-Call!</p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> Warum kann ich my_a_ptr in einen C* casten (nur statisch natuerlich) obwohl es nur die Information eines B* enthaelt? Wird im Zweifelsfall dann nicht information hinzugedichtet?</p>
<p>Gruesse</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1224486</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1224486</guid><dc:creator><![CDATA[Frager]]></dc:creator><pubDate>Wed, 07 Feb 2007 15:03:56 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu dynamic_cast on Wed, 07 Feb 2007 15:20:29 GMT]]></title><description><![CDATA[<p>Frager schrieb:</p>
<blockquote>
<p>...</p>
<pre><code class="language-cpp">class A {
  public:
    A () {cerr &lt;&lt; &quot; Ich bin ein A!&quot; &lt;&lt; endl;}
    void Call() {cerr &lt;&lt; &quot; Ich bin ein A-Call!&quot; &lt;&lt; endl;}
</code></pre>
<p>...</p>
</blockquote>
<p>Hi,</p>
<p>schreib da mal &quot;virtual&quot; vor:</p>
<pre><code class="language-cpp">virtual void Call() { ...
</code></pre>
<p>(kannst Du bei den &quot;Kindern&quot; uch machen, ist da dann aber egal).<br />
Du brauchst da gar keinen cast .... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Und die ganze &quot;Pointerei&quot; ist auch ziemlich überflüssig:</p>
<pre><code class="language-cpp">void Test2(A* a) { a-&gt;Call(); }

void Test1() {
    A my_a;
    B my_b;
    C my_c;

    my_a.Call();
    my_b.Call();
    my_c.Call();

   Test2(&amp;my_a);
   Test2(&amp;my_b);
   Test2(&amp;my_c);
</code></pre>
<p>Allerdings scheint nicht ganz klar zu sein, was Du willst: Soll Dein Objekt eine (je nach Klasse speziell zugeschnittene) Funktion haben, dann nimm virtual .... wenn nicht, dann sollten sie auch nicht denselben Namen haben.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1224490</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1224490</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 07 Feb 2007 15:20:29 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu dynamic_cast on Wed, 07 Feb 2007 15:17:50 GMT]]></title><description><![CDATA[<p>ok,</p>
<p>dann funktioniert dynamic_cast bei A* -&gt; B* und bei A* -&gt; C* gibt es eine segmention fault.</p>
<p>Static_cast laeuft wie gehabt ...</p>
<p>Erklaerungen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1224497</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1224497</guid><dc:creator><![CDATA[Frager]]></dc:creator><pubDate>Wed, 07 Feb 2007 15:17:50 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu dynamic_cast on Wed, 07 Feb 2007 15:33:02 GMT]]></title><description><![CDATA[<p>Frager schrieb:</p>
<blockquote>
<p>ok,</p>
<p>dann funktioniert dynamic_cast bei A* -&gt; B* und bei A* -&gt; C* gibt es eine segmention fault.</p>
<p>Static_cast laeuft wie gehabt ...</p>
<p>Erklaerungen?</p>
</blockquote>
<p>Ich glaube, Du bekommst da was &quot;kerndurcheinander&quot;:<br />
Wenn eine Klasse B von A erbt, dann will man damit üblicherweise ausdrücken, dass <em>jedes B ein A ist</em>. D.h. Du kannst alles, was Du mit einem A machen kannst, auch mit einem B machen (hier z.B. Call() aufrufen).<br />
Das weiß der Compiler auch und Du brauchst es ihm nicht mehr über einen (dynamic-)cast mitzuteilen.</p>
<p>Mit einem &quot;cast&quot; sagst Du dem Compiler &quot;Ich weiß es besser als Du&quot; .... aber das sollte natürlich auch stimmen.<br />
In Deinem Fall (gibt es wirklich einen &quot;segmentation fault&quot; ? Oder nicht doch eher eine unhandled exception ?) hast Du ihm bestimmt ein X für ein U vorgemacht .. so in der Art:</p>
<pre><code class="language-cpp">A* a = new B(); // das Objekt, auf das a zeigt, ist ein B
C* c = dynamic_cast&lt;C*&gt;(a); // FEHLER !! Das Objekt ist und bleibt ein B 
      // und egal, was Du davorschreibst: Es wird kein C daraus !
      // Da Du aber dem Compier gesagt hast, dass Du es besser weißt, kann er 
      // nichts dagegen machen.
</code></pre>
<p>Vergleich das mit sprechenderen Klassennamen:</p>
<pre><code class="language-cpp">class Lebewesen {}
class Tier : public Lebewesen { virtual void fressen();}
class Elefant : public Tier { void ruesselBlasen();}

Lebewesen* tier = new Tier();
Elefant* e = dynamic_cast&lt;Elefant*&gt;(tier);
e-&gt;ruesselBlasen(); // Autsch ! Ein Elefant ist zwar ein Tier, aber nicht jedes Tier ist ein Elefant
</code></pre>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1224513</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1224513</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 07 Feb 2007 15:33:02 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu dynamic_cast on Wed, 07 Feb 2007 15:46:26 GMT]]></title><description><![CDATA[<p>Hallo Frager</p>
<p>Mit static_cast zwingst Du den Compiler die Umwandlung vorzunehmen. Der Compiler kann im allgemeinen nicht wissen, ob hinter dem Zeiger auf A ein Objekt vom Typ A,B oder C liegt. Du sagst, Du weißt es und der Compiler vertraut Dir. Das Du danach mit dem falsch gecasteten Zeiger noch weiterarbeiten kannst, ist purer Zufall. (Auch undefiniertes Verhalten gennant). Du könntest genauso einen Seg_Fault bekommen, oder es passieren noch schlimmere Dinge.<br />
Beim Dynamic_cast wird erst zur Laufzeit festgestellt, ob die dynamische Umwandung<br />
möglich ist. (Dazu brauchst Du mindesten eine virtuelle Methode).<br />
Wenn die Umwandlung nicht möglich ist bekommst Du einen NULL-Pointer zurück. Und den darfst Du natürlich nicht dereferenzieren. --&gt; SegFault.</p>
<p>DJohn</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1224521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1224521</guid><dc:creator><![CDATA[DJohn]]></dc:creator><pubDate>Wed, 07 Feb 2007 15:46:26 GMT</pubDate></item></channel></rss>