<?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 zur Initialisierungsliste]]></title><description><![CDATA[<p>Hi,</p>
<p>ich code in letzter Zeit viel mit C# und hab mich da richtig in den Constructor gewöhnt.</p>
<p>Dort kann man in der Initialisierungsliste einen weiteren konstruktor aufrufen, wo eine implementierung enthalten sein kann.</p>
<p>Jetzt wollte ich dies auch in C++ machen, doch das geht leider nicht - wahrscheinlich mache ich was falsch.</p>
<p>Hier mein Code:</p>
<pre><code class="language-cpp">color::color (void) :
    this (.0f)  // Weiterleiten an 2. Konstruktor geht nicht. :( &quot;error C2059: syntax error : 'this'&quot;
{
}

color::color (float value) :
    red (value),
    green (value),
    blue (value)
{
}
</code></pre>
<p>Ist dies in C++ definitiv nicht möglich? Gibt es ggf. work-arounds?</p>
<p>Das ist nur 1 Klasse von vielen wo ich das machen möchte, gerade wenn ich mehr als 3 Argumente habe, ist das extrem Praktisch. <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>
<p>Ich hoffe ihr könnt mir weiterhelfen. <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>
<p>Liebe Grüße,<br />
Euer C++ - Coder</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/219422/frage-zur-initialisierungsliste</link><generator>RSS for Node</generator><lastBuildDate>Thu, 08 Oct 2026 03:13:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/219422.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 02 Aug 2008 22:48:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zur Initialisierungsliste on Sat, 02 Aug 2008 22:48:20 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich code in letzter Zeit viel mit C# und hab mich da richtig in den Constructor gewöhnt.</p>
<p>Dort kann man in der Initialisierungsliste einen weiteren konstruktor aufrufen, wo eine implementierung enthalten sein kann.</p>
<p>Jetzt wollte ich dies auch in C++ machen, doch das geht leider nicht - wahrscheinlich mache ich was falsch.</p>
<p>Hier mein Code:</p>
<pre><code class="language-cpp">color::color (void) :
    this (.0f)  // Weiterleiten an 2. Konstruktor geht nicht. :( &quot;error C2059: syntax error : 'this'&quot;
{
}

color::color (float value) :
    red (value),
    green (value),
    blue (value)
{
}
</code></pre>
<p>Ist dies in C++ definitiv nicht möglich? Gibt es ggf. work-arounds?</p>
<p>Das ist nur 1 Klasse von vielen wo ich das machen möchte, gerade wenn ich mehr als 3 Argumente habe, ist das extrem Praktisch. <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>
<p>Ich hoffe ihr könnt mir weiterhelfen. <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>
<p>Liebe Grüße,<br />
Euer C++ - Coder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1558290</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1558290</guid><dc:creator><![CDATA[C++ - Coder]]></dc:creator><pubDate>Sat, 02 Aug 2008 22:48:20 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Initialisierungsliste on Sat, 02 Aug 2008 23:08:44 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">color::color(void)
{
    this-&gt;color(.0f);
}
</code></pre>
<p>denke mal das sollte so gehen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1558299</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1558299</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Sat, 02 Aug 2008 23:08:44 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Initialisierungsliste on Sun, 03 Aug 2008 00:26:52 GMT]]></title><description><![CDATA[<p>Schade, dass das nicht direkt über die Initlaisierungsliste geht, aber egal. <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="🙂"
    /> Dank dir.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1558319</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1558319</guid><dc:creator><![CDATA[C++ - Coder]]></dc:creator><pubDate>Sun, 03 Aug 2008 00:26:52 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Initialisierungsliste on Sun, 03 Aug 2008 06:33:18 GMT]]></title><description><![CDATA[<p>Du könntest auch nur 1 Konstruktor, aber mit Default-Argument verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1558343</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1558343</guid><dc:creator><![CDATA[plaintext]]></dc:creator><pubDate>Sun, 03 Aug 2008 06:33:18 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Initialisierungsliste on Sun, 03 Aug 2008 07:36:03 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18806">@Skym0sh0</a> das fliegt dir ganz brav um die ohren, weil sich kontruktoren nicht gegenseitig aufrufen dürfen...<br />
entweder mit default-value, wie plaintext es vorschlug oder für den std-ctor die initlist noch mit nullen tippen:</p>
<pre><code class="language-cpp">color()
    :red(0),green(0),blue(0)
  {}
</code></pre>
<p>oder eben mit default-value:</p>
<pre><code class="language-cpp">color(float value=0)
    :red(value),green(value),blue(value)
  {}
</code></pre>
<p>der ersetzt dann den std-ctor.</p>
<p>btw. &quot;0f&quot; muss du nur schreiben, wenn du explizit floats brauchst, es aber auch andere dinge übergeben werden könnten. ansonsten kann man dem c++-typsystem die konvertierung überlassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1558352</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1558352</guid><dc:creator><![CDATA[ghorst]]></dc:creator><pubDate>Sun, 03 Aug 2008 07:36:03 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Initialisierungsliste on Sun, 03 Aug 2008 08:35:12 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">color::color(void)
{
    this-&gt;color(.0f);
}
</code></pre>
<p>Ich glaube mal gelesen zu haben, der this-Pointer dürfe im Konstruktor nicht verwendet werden. Ist das nicht (mehr) so? Ich vermeide das auf jeden Fall.</p>
<p>Sorry für OT.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1558373</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1558373</guid><dc:creator><![CDATA[plaintext]]></dc:creator><pubDate>Sun, 03 Aug 2008 08:35:12 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Initialisierungsliste on Sun, 03 Aug 2008 08:42:15 GMT]]></title><description><![CDATA[<p>ghorst schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18806">@Skym0sh0</a> das fliegt dir ganz brav um die ohren, weil sich kontruktoren nicht gegenseitig aufrufen dürfen...</p>
</blockquote>
<p>Kleine Anmerkung: In C++0x soll das gehen, allerdings soll IIRC dadurch keine Reukrsion erlaubt sein.</p>
<p>EDIT:</p>
<p>plaintext schrieb:</p>
<blockquote>
<p>Ich glaube mal gelesen zu haben, der this-Pointer dürfe im Konstruktor nicht verwendet werden. Ist das nicht (mehr) so?</p>
</blockquote>
<p>Das war noch nie verboten, man darf/sollte nur keine virtuellen Methoden im Konstruktor aufrufen, da erst nach der Abarbeitung des Konstruktor das Objekt den richtigen Typ hat (dadurch kann man es zum Beispiel schaffen pure virtual Methoden aufzurufen <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>Felix</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1558375</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1558375</guid><dc:creator><![CDATA[Phoemuex]]></dc:creator><pubDate>Sun, 03 Aug 2008 08:42:15 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Initialisierungsliste on Sun, 03 Aug 2008 09:00:12 GMT]]></title><description><![CDATA[<p>ja, die erweiterung vondsich gegenseitig aufrufenden ctors ist für c-0x vorgesehen. nur das haben wir noch nicht. <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>
<p>eine abstract virtuall sollte damit nicht aufrufbar sein, da sollte der compiler meckern. wenn man aber eine instanierte version hat, ist s nicht ratsam, weil es sich nicht so verhält, wie man es erwartet:</p>
<pre><code class="language-cpp">class color{
public:
  color()
    :red(0),blue(0)
  {
    green=value();
  }
  virtual int value() {return 0;}
private:
  float red,green,blue;
};

class color2:public color{
  public:
    virtual int value() {return 1;}
};
</code></pre>
<p>wenn jetzt color2 instanier wird, wird green trotzdem 0 sein, da zum zeitpunkt des setzens nur die vtable von color existiert, erst nach dem verlassen des ctor wird die tabelle auf color2 abgeändert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1558383</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1558383</guid><dc:creator><![CDATA[ghorst]]></dc:creator><pubDate>Sun, 03 Aug 2008 09:00:12 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Initialisierungsliste on Mon, 04 Aug 2008 08:51:18 GMT]]></title><description><![CDATA[<p>ghorst schrieb:</p>
<blockquote>
<p>eine abstract virtuall sollte damit nicht aufrufbar sein, da sollte der compiler meckern.</p>
</blockquote>
<p>Also das hier kompiliert unter Comeau und g++ einwandfrei durch (EDIT: und ruft erstaunlicherweise sogar das richtige auf...):</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

class Base
{
    public:
        virtual void Test() = 0;
};

class Derived : public Base
{
    public:
        Derived()
        {
             Test();
        }
        virtual void Test()
        {
             cout &lt;&lt; &quot;Test&quot; &lt;&lt; endl;
        }
};
</code></pre>
<p><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>Felix</p>
<p>EDIT: Jetzt habe ich mein richtiges Beispiel wieder gefunden:</p>
<p><strong>test.h</strong></p>
<pre><code class="language-cpp">class Base
{
    public:
        Base();
        virtual int Test() = 0;
    private:
        int foo;
        void init();
};

class Derived : public Base
{
    public:
        Derived();
        virtual int Test();
};
</code></pre>
<p><strong>Test.cpp</strong></p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

#include &quot;test.h&quot;

using namespace std;

Base::Base()
{
    init();
}

void Base::init()
{
    foo = Test();
}

Derived::Derived() : Base()
{
}

int Derived::Test()
{
     cout &lt;&lt; &quot;Test&quot; &lt;&lt; endl;
     return 5;
}

int main()
{
    Base *test = new Derived();
    delete test;
    return 0;
}
</code></pre>
<p>Gibt:</p>
<pre><code>pure virtual method called
terminate called without an active exception
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1558818</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1558818</guid><dc:creator><![CDATA[Phoemuex]]></dc:creator><pubDate>Mon, 04 Aug 2008 08:51:18 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Initialisierungsliste on Mon, 04 Aug 2008 09:02:20 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/16391">@ghorst</a>! Soll ich Dir zu Weihnachten eine Shift-Taste schenken? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1558850</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1558850</guid><dc:creator><![CDATA[Bulli]]></dc:creator><pubDate>Mon, 04 Aug 2008 09:02:20 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Initialisierungsliste on Mon, 04 Aug 2008 10:05:42 GMT]]></title><description><![CDATA[<p>ghorst schrieb:</p>
<blockquote>
<p>[...]<br />
wenn jetzt color2 instanier wird, wird green trotzdem 0 sein, da zum zeitpunkt des setzens nur die vtable von color existiert, erst nach dem verlassen des ctor wird die tabelle auf color2 abgeändert.</p>
</blockquote>
<p>Nein, im ctor wird gar nichts über irgendwelche polymorphen Geschichten gelöst, es wird ganz einfach statisch auf diese Methode zugegriffen wie auf jeden nicht-virtuelle Methode auch. Kurz: ob virtual oder nicht hat im Konstruktor keine Bedeutung, es ist also äquivalent zu color::value() (welches ebenfalls virtual außerhalb des Konstruktors deaktiviert).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1558885</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1558885</guid><dc:creator><![CDATA[FALSCH!]]></dc:creator><pubDate>Mon, 04 Aug 2008 10:05:42 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Initialisierungsliste on Mon, 04 Aug 2008 11:19:03 GMT]]></title><description><![CDATA[<p>Phoemuex schrieb:</p>
<blockquote>
<p>ghorst schrieb:</p>
<blockquote>
<p>eine abstract virtuall sollte damit nicht aufrufbar sein, da sollte der compiler meckern.</p>
</blockquote>
<p>Also das hier kompiliert unter Comeau und g++ einwandfrei durch (EDIT: und ruft erstaunlicherweise sogar das richtige auf...):</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

class Base
{
    public:
        virtual void Test() = 0;
};

class Derived : public Base
{
    public:
        Derived()
        {
             Test();
        }
        virtual void Test()
        {
             cout &lt;&lt; &quot;Test&quot; &lt;&lt; endl;
        }
};
</code></pre>
</blockquote>
<p>Das ist auch nciht weiter verwunderlich, da du nirgendwo mit Polymorphie arbeitest. Du rufst im Ctor von Derived Test() auf und der Compiler macht da zur Compilezeit einen Aufruf von Derived::Test draus.<br />
Genausowenig verwunderlich ist, dass du einen Compilerfehler bekommst wenn du im Ctor von Test eine pur virtuelle Funktion direkt aufrufst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1558926</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1558926</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 04 Aug 2008 11:19:03 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Initialisierungsliste on Mon, 04 Aug 2008 11:36:49 GMT]]></title><description><![CDATA[<p>FALSCH! schrieb:</p>
<blockquote>
<p>Nein, im ctor wird gar nichts über irgendwelche polymorphen Geschichten gelöst, es wird ganz einfach statisch auf diese Methode zugegriffen wie auf jeden nicht-virtuelle Methode auch.</p>
</blockquote>
<p>und das kann er aus einem einfachen grund: er kennt die exakte vtable, nämlich seine... da er die kennt, können die virtual functions entsprechend auf &quot;normale&quot; reduziert werden. muss er aber nicht machen. wenn er lustig ist, kann er die gerne auch über das langsamere virtual-interface aufrufen.</p>
<p>@pumuckle das &quot;pure virtual method called<br />
terminate called without an active exception&quot; ist kein compilerfehler, sondern ein laufzeitfehler. (falls du den meintest.)</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/7719">@Phoemuex</a> ok. der klappt tatsächlich, weil der compiler nicht erkennt, dass init eigentlich eine verkappte virtuelle funktion ist. das ist übrigens das, was ich oben mit der vtable zu erklären versuchte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1558937</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1558937</guid><dc:creator><![CDATA[ghorst]]></dc:creator><pubDate>Mon, 04 Aug 2008 11:36:49 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Initialisierungsliste on Mon, 04 Aug 2008 11:46:38 GMT]]></title><description><![CDATA[<p>ghorst schrieb:</p>
<blockquote>
<p>FALSCH! schrieb:</p>
<blockquote>
<p>Nein, im ctor wird gar nichts über irgendwelche polymorphen Geschichten gelöst, es wird ganz einfach statisch auf diese Methode zugegriffen wie auf jeden nicht-virtuelle Methode auch.</p>
</blockquote>
<p>und das kann er aus einem einfachen grund: er kennt die exakte vtable, nämlich seine... da er die kennt, können die virtual functions entsprechend auf &quot;normale&quot; reduziert werden. muss er aber nicht machen. wenn er lustig ist, kann er die gerne auch über das langsamere virtual-interface aufrufen.</p>
</blockquote>
<p>Nein, das stimmt so einfach nicht. Er macht es so wie ich gesagt habe, im Standard gibt es keine vtables. Es ist nur ein Seiteneffekt in der Praxis, da die Compiler mit vtables arbeiten, aber der Standard sagt ganz eindeutig das was ich gesagt habe. Und darauf musst du dich als Programmierer verlassen nicht auf die Implementierung von den Compilern, welche oftmals sogar closed-source sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1558945</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1558945</guid><dc:creator><![CDATA[FALSCH!]]></dc:creator><pubDate>Mon, 04 Aug 2008 11:46:38 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Initialisierungsliste on Mon, 04 Aug 2008 12:01:33 GMT]]></title><description><![CDATA[<p>FALSCH! schrieb:</p>
<blockquote>
<p>...der Standard sagt ganz eindeutig das was ich gesagt habe....</p>
</blockquote>
<p>Magst Du mal eine Quellenangabe liefern ? Ich bin relativ sicher, dass der Std eine Technik wie vtables weder vorschreibt noch verbietet ... aber verbietet er wirklich &quot;Polymorphie im Konstruktor&quot; ?</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1558956</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1558956</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Mon, 04 Aug 2008 12:01:33 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Initialisierungsliste on Mon, 04 Aug 2008 12:11:04 GMT]]></title><description><![CDATA[<p>die erklärungen stehen in &quot;12.7 Construction and destruction [class.cdtor]&quot; (da geht es um polymorphie im ctor und dtor)<br />
und &quot;12.6.2 - Initializing bases and members [class.base.init]&quot; und dort der 8. abschnitt.</p>
<p>was ich hier schrieb, ist das, was ich daraus gefolgert habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1558962</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1558962</guid><dc:creator><![CDATA[ghorst]]></dc:creator><pubDate>Mon, 04 Aug 2008 12:11:04 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Initialisierungsliste on Mon, 04 Aug 2008 13:01:29 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>aber verbietet er wirklich &quot;Polymorphie im Konstruktor&quot; ?</p>
</blockquote>
<p>Wenn er es nicht direkt verbietet, dann doch implizit, da er verlangt, dass Basisklassenteile eines Objektes immer zuerst initialisiert werden. Und während der Konstruktion des Basis-Objektes hat das Objekt keine Möglichkeit festzustellen, dass es eigentlich ein abgeleitetes Objekt ist, genauer gesagt: werden soll. Nach der Philosophie von C++ <em>existiert</em> ein Objekt erst nach dem Abarbeiten des Ctors und kann auch dann erst polymorphes verhalten zweigen. Genausowenig ist Polymorphie im Dtor möglich, da der abgeleitete Teil eines Objektes bereits nicht mehr existent ist, wenn der Basisklassen-Dtor betreten wird.</p>
<p>Links zum Thema:<br />
<a href="http://www.artima.com/cppsource/nevercall.html" rel="nofollow">http://www.artima.com/cppsource/nevercall.html</a><br />
<a href="http://gcc.gnu.org/ml/gcc-help/2001-11/msg00208.html" rel="nofollow">http://gcc.gnu.org/ml/gcc-help/2001-11/msg00208.html</a> (und followups)<br />
<a href="http://www.gamedev.net/community/forums/topic.asp?topic_id=483196" rel="nofollow">http://www.gamedev.net/community/forums/topic.asp?topic_id=483196</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559029</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559029</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 04 Aug 2008 13:01:29 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Initialisierungsliste on Mon, 04 Aug 2008 13:19:51 GMT]]></title><description><![CDATA[<p>naja. ich würde es so ausdrücken, der standard drückt sich. aus 12.7 - 2:</p>
<blockquote>
<p>Member functions, including virtual functions (class.virtual), can be called during construction or destruction (class.base.init). When a virtual function is called directly or indirectly from a constructor (including from the mem-initializer for a data member) or from a destructor, and the object to which the call applies is the object under construction or destruction, the function called is the one defined in the constructor or destructor's own class or in one of its bases, but not a function overriding it in a class derived from the constructor or destructor's class, or overriding it in one of the other base classes of the most derived object (intro.object).</p>
</blockquote>
<p>ich verstehe das so: virtuell geht schon, wird aber immer in dem context der klasse ausgeführt, zu der der ctor gehört. daraus folgt: kann wegoptimiert werden, wenn der compiler es erkennt. bei indirekten kann er es nicht unbedingt erkennen und er läuft in die falle.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559044</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559044</guid><dc:creator><![CDATA[ghorst]]></dc:creator><pubDate>Mon, 04 Aug 2008 13:19:51 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Initialisierungsliste on Mon, 04 Aug 2008 13:34:34 GMT]]></title><description><![CDATA[<p>ghorst schrieb:</p>
<blockquote>
<p>ich verstehe das so: virtuell geht schon, wird aber immer in dem context der klasse ausgeführt, zu der der ctor gehört.</p>
</blockquote>
<p>Du kannst virtuelle Funktionen aufrufen, das ja. Du wirst aber kein Polymorphes Verhalten bekommen, sprich es werden NICHT die abgeleiteten Versionen aufgerufen, wenn du die Fuktion im Basisklassen-Ctor aufrufst.</p>
<blockquote>
<p>daraus folgt: kann wegoptimiert werden, wenn der compiler es erkennt. bei indirekten kann er es nicht unbedingt erkennen und er läuft in die falle.</p>
</blockquote>
<p>Da wie du schon geschrieben hast die Funktion immer im Kontext der Klasse aufgerufen wird, kann der Compiler auf jeden Fall schon zur Compilezeit erkennen, welche Version aufgerufen wird. Das Verhalten ist in dem Fall unabhängig davon, ob die Funktion virtuell ist oder nicht:</p>
<pre><code class="language-cpp">class Base {
protected:
  virtual void virt() {cout &lt;&lt; &quot;Base::virt\n&quot;;}
  void nonvirt() {cout &lt;&lt; &quot;Base::nonvirt\n&quot;;}
public:
  Base() {}
};

class Intermediate1 : public Base {
public:
  Intermediate1()
  {
    virt();
    nonvirt();
  }
};

class Intermediate2 : public Base {
protected:
  virtual void virt() {cout &lt;&lt; &quot;Inter2::virt\n&quot;;}
  void nonvirt() {cout &lt;&lt; &quot;Inter2::nonvirt\n&quot;;}
public:
  Intermediate2()
  {
    virt();
    nonvirt();
  }
};

class Derived1 : public Intermediate1
{
protected:
  virtual void virt() {cout &lt;&lt; &quot;Derived1::virt\n&quot;;}
};

class Derived2 : public Intermediate2
{
protected:
  virtual void virt() {cout &lt;&lt; &quot;Derived2::virt\n&quot;;}
};

int main()
{
  cout &lt;&lt; &quot;D1:\n&quot;;
  Derived1 d1;
  cout &lt;&lt; &quot;\nD2:\n&quot;;
  Derived2 d2;
}
</code></pre>
<p>Output:</p>
<pre><code>D1:
Base::virt
Base::nonvirt

D2:
Inter2::virt
Inter2::nonvirt
</code></pre>
<p>Es werden die virtuellen und nicht virtuellen Methoden aufgerufen die den Intermediate-Klassen bekannt sind, da während deren Konstruktion eben nicht bekannt ist, dass das Objekt mal ein Derived werden soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559049</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559049</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 04 Aug 2008 13:34:34 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Initialisierungsliste on Mon, 04 Aug 2008 13:43:56 GMT]]></title><description><![CDATA[<p>bei den indirekten ging es mir um das bsp von Phoemuex, der wunderbar vorgemacht hat, dass der gcc zu blöd ist, rauszubekommen, dass er ein ungültige funktion aufruft. man könnte es im compiler so implementieren, dass er das auch erkennt.<br />
die frage ist dann nur, stehen kosten und nutzen in einem sinnvollen verhältnis? und bis zu welcher tiefe sollte er nicht-virtuelle funktionen nach virtuellen durchsuche, um diese auf abstract virtual zu testen bzw. durch normale calls ersetzen?<br />
aus den beiden fragen heraus, werden sich wohl einige compiler wie der gcc verhalten und einfach virtual-aufrufe durchführen, auch wenn sie eigentlich diese durch normale ersetzen könnten. hier greift dann der standard, der hier die normalen polysmorphieregeln zur auflösung vorschreibt, wobei die klasse des aktuelle ctors als die letzte in der hierachie angesehen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559054</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559054</guid><dc:creator><![CDATA[ghorst]]></dc:creator><pubDate>Mon, 04 Aug 2008 13:43:56 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Initialisierungsliste on Mon, 04 Aug 2008 14:22:48 GMT]]></title><description><![CDATA[<p>Aha !!! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /></p>
<p>Danke - man lernt nie aus,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559078</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559078</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Mon, 04 Aug 2008 14:22:48 GMT</pubDate></item></channel></rss>