<?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[Vermutlich ganz banales Problem mit RTTI]]></title><description><![CDATA[<p>Guten Tag alle zusammen<br />
Ich tue mich gerade ein wenig schwer mit der RTTI. Wieso ist die Ausgabe des folgenden Codes &quot;class A&quot; und nicht &quot;class B&quot;? Soviel ich weis, funktioniert die RTTI nur dann, wenn die entsprechende Klasse mindestens einmal abgeleitet wurde und die Basisklasse mindestens eine virtuelle Funktion besitzt. Beide Bedingungen sind doch in dem folgenden Fall erfüllt?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class A{
public:
 A(void){std::cout &lt;&lt; typeid(*this).name() &lt;&lt; std::endl;}
 virtual ~A(void){}
};

class B:A{
};

void main(){
 B b;
}
</code></pre>
<p>Ausgabe: &quot;class A&quot; <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="😕"
    /></p>
<p>Vielen Dank im Vorraus! <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/topic/252627/vermutlich-ganz-banales-problem-mit-rtti</link><generator>RSS for Node</generator><lastBuildDate>Mon, 14 Sep 2026 08:30:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/252627.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 22 Oct 2009 14:05:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vermutlich ganz banales Problem mit RTTI on Thu, 22 Oct 2009 14:05:47 GMT]]></title><description><![CDATA[<p>Guten Tag alle zusammen<br />
Ich tue mich gerade ein wenig schwer mit der RTTI. Wieso ist die Ausgabe des folgenden Codes &quot;class A&quot; und nicht &quot;class B&quot;? Soviel ich weis, funktioniert die RTTI nur dann, wenn die entsprechende Klasse mindestens einmal abgeleitet wurde und die Basisklasse mindestens eine virtuelle Funktion besitzt. Beide Bedingungen sind doch in dem folgenden Fall erfüllt?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class A{
public:
 A(void){std::cout &lt;&lt; typeid(*this).name() &lt;&lt; std::endl;}
 virtual ~A(void){}
};

class B:A{
};

void main(){
 B b;
}
</code></pre>
<p>Ausgabe: &quot;class A&quot; <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="😕"
    /></p>
<p>Vielen Dank im Vorraus! <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/1796405</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1796405</guid><dc:creator><![CDATA[Ishildur]]></dc:creator><pubDate>Thu, 22 Oct 2009 14:05:47 GMT</pubDate></item><item><title><![CDATA[Reply to Vermutlich ganz banales Problem mit RTTI on Thu, 22 Oct 2009 14:33:35 GMT]]></title><description><![CDATA[<p>Wenn ich mich richtig erinnere, wird zuerst der A Teil, und dann der B Teil konstruiert.<br />
Im A Konstruktor existiert folglich nur ein A, nicht aber ein B Object (virtuelle Funktionsaufrufe rufen folglich auch die Funktion in A und nicht in B auf).</p>
<p>Bei der Destruktion ist es genau anders herum, erst wird B, dann A zerstört.</p>
<p>Ich kann mich aber auch irren...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1796429</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1796429</guid><dc:creator><![CDATA[Gugi]]></dc:creator><pubDate>Thu, 22 Oct 2009 14:33:35 GMT</pubDate></item><item><title><![CDATA[Reply to Vermutlich ganz banales Problem mit RTTI on Thu, 22 Oct 2009 14:35:18 GMT]]></title><description><![CDATA[<p>Das ist erst nach Ende des Kunstruktors so ein Ding. Vorher wär's ja ein wenig gelogen. Stell Dir vor, eine virtuelle Funkltion braucht ein korrekt initialisiertes Member. Dann darf die erst aufgerufen werden, wenn der Konstruktor durch ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1796431</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1796431</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 22 Oct 2009 14:35:18 GMT</pubDate></item><item><title><![CDATA[Reply to Vermutlich ganz banales Problem mit RTTI on Thu, 22 Oct 2009 15:03:53 GMT]]></title><description><![CDATA[<p>Hmm ha I see, I see.<br />
Gibt es vielleicht einen Workaround um dasselbe zu erreichen? Ich benötige dies fürs Exception Handling und finde es ein wenig doof, in jeder Exception noch einen String mit dem Namen der Exception mitgeben zu müssen <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="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1796448</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1796448</guid><dc:creator><![CDATA[Ishildur]]></dc:creator><pubDate>Thu, 22 Oct 2009 15:03:53 GMT</pubDate></item><item><title><![CDATA[Reply to Vermutlich ganz banales Problem mit RTTI on Thu, 22 Oct 2009 15:14:26 GMT]]></title><description><![CDATA[<p>Ishildur schrieb:</p>
<blockquote>
<p>Hmm ha I see, I see.<br />
Gibt es vielleicht einen Workaround um dasselbe zu erreichen? Ich benötige dies fürs Exception Handling und finde es ein wenig doof, in jeder Exception noch einen String mit dem Namen der Exception mitgeben zu müssen <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="😉"
    /></p>
</blockquote>
<p>Aber das Exception-Objekt ist doch vollständig Konstruiert, wenn Du die what() aufrufst. Null Problemo.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1796452</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1796452</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 22 Oct 2009 15:14:26 GMT</pubDate></item><item><title><![CDATA[Reply to Vermutlich ganz banales Problem mit RTTI on Thu, 22 Oct 2009 16:07:50 GMT]]></title><description><![CDATA[<p>Hmm das funktioniert leider auch nicht, IMHO aus demselben Grund. B ist doch bei dieser Variante immer noch nicht konstruiert, wenn ich typeid(*this) aufrufe?</p>
<pre><code class="language-cpp">class A:std::exception{
public:
 A(void){
  std::cout &lt;&lt; typeid(*this).name() &lt;&lt; std::endl;
  std::cout &lt;&lt; this-&gt;what() &lt;&lt; std::endl;}
 virtual ~A(void){}
};

class B:A{
};

void main(){
 B b;

 system(&quot;PAUSE&quot;);
}
</code></pre>
<p>Output:<br />
class A<br />
UnknownException</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1796485</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1796485</guid><dc:creator><![CDATA[Ishildur]]></dc:creator><pubDate>Thu, 22 Oct 2009 16:07:50 GMT</pubDate></item><item><title><![CDATA[Reply to Vermutlich ganz banales Problem mit RTTI on Thu, 22 Oct 2009 16:17:38 GMT]]></title><description><![CDATA[<p>Ach, ich dachte, Du fängst die in der main() und gibst dort what() aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1796495</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1796495</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 22 Oct 2009 16:17:38 GMT</pubDate></item><item><title><![CDATA[Reply to Vermutlich ganz banales Problem mit RTTI on Thu, 22 Oct 2009 17:46:59 GMT]]></title><description><![CDATA[<p>Ishildur schrieb:</p>
<blockquote>
<pre><code class="language-cpp">class A:std::exception
{
public:
  A(void){
    std::cout &lt;&lt; typeid(*this).name() &lt;&lt; std::endl;
    std::cout &lt;&lt; this-&gt;what() &lt;&lt; std::endl;
  }
  virtual ~A(void){}
};
</code></pre>
</blockquote>
<p>Die Regel ist ganz einfach: Wenn Du im Konstruktor<sup>1</sup> oder Destruktor<sup>2</sup> eine virtuelle Funktion des Objektes aufrufst, dann wird das nie eine Funktion einer abgeleiteten Klasse sein, weil der &quot;abgeleitete Teil&quot; entwender <em>noch nicht</em><sup>1</sup> oder <em>nicht mehr</em><sup>2</sup> verfügbar ist. Das schließt auch die dynamische Typinformation ein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1796586</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1796586</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Thu, 22 Oct 2009 17:46:59 GMT</pubDate></item><item><title><![CDATA[Reply to Vermutlich ganz banales Problem mit RTTI on Thu, 22 Oct 2009 17:55:51 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/36159">@Sebastian</a> Pizer<br />
Ja das habe ich inzwischen schon verstanden <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 />
Meine Frage ist nun ob es für dieses Problem einen bekannten Workaround gibt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1796594</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1796594</guid><dc:creator><![CDATA[Ishildur]]></dc:creator><pubDate>Thu, 22 Oct 2009 17:55:51 GMT</pubDate></item><item><title><![CDATA[Reply to Vermutlich ganz banales Problem mit RTTI on Thu, 22 Oct 2009 18:48:47 GMT]]></title><description><![CDATA[<p>Ishildur schrieb:</p>
<blockquote>
<p>Meine Frage ist nun ob es für dieses Problem einen bekannten Workaround gibt?</p>
</blockquote>
<p>typeid nicht im Konstruktor aufrufen?</p>
<p>Für dieses spezielle Problem könntest du vielleicht <code>__FUNCTION__</code> benutzen, was manche Compiler zur Verfügung stellen:</p>
<pre><code class="language-cpp">class A: public std::exception
{
public:
    A(const char* id) { std::cout &lt;&lt; id &lt;&lt; std::endl; }
    virtual ~A() throw() {}
};

class B: public A
{
public:
    B() : A(__FUNCTION__) { }
};

int main()
{
    B b;
}
</code></pre>
<p>Wenn dein Compiler/Preprocessor <code>__FUNCTION__</code> kennt, macht der Code das, was du willst. Ist aber nicht hübsch, oder besonders portabel.</p>
<p>Und noch ein paar Standard-Belehrungen:</p>
<ul>
<li><code>void main()</code> ist falsch - <code>int main()</code> ist richtig</li>
<li><code>void</code> in den leeren Klammern einer Funktionsdeklaration ohne Parameter ist in C++ unnötig. Ein C-Relikt.</li>
<li><code>throw()</code> hinter dem Destruktor einer <code>std::exception</code> -Ableitung ist ratsam, dann klappts auch mit allen Compilern<br />
- Du willst in diesem Fall <code>public</code> -Vererbung (ist-ein), nicht <code>private</code> (hat-ein)</li>
</ul>
]]></description><link>https://www.c-plusplus.net/forum/post/1796629</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1796629</guid><dc:creator><![CDATA[Registrierter Troll]]></dc:creator><pubDate>Thu, 22 Oct 2009 18:48:47 GMT</pubDate></item><item><title><![CDATA[Reply to Vermutlich ganz banales Problem mit RTTI on Thu, 22 Oct 2009 19:54:46 GMT]]></title><description><![CDATA[<p>Ishildur schrieb:</p>
<blockquote>
<p>Hmm das funktioniert leider auch nicht, IMHO aus demselben Grund. B ist doch bei dieser Variante immer noch nicht konstruiert, wenn ich typeid(*this) aufrufe?</p>
</blockquote>
<p>Es ist vollkommen sinnfrei in C++ im Konstruktor typeid aufzurufen, da der Typ der Klasse im Kontruktor ohnehin bekannt ist. Es gibt keine &quot;virtuellen&quot; Konstruktoren in C++.</p>
<p>Also, formulieren Deine Klasse um.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1796698</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1796698</guid><dc:creator><![CDATA[*john 0]]></dc:creator><pubDate>Thu, 22 Oct 2009 19:54:46 GMT</pubDate></item></channel></rss>