<?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[Methode in Initalisierungsliste aufrufen]]></title><description><![CDATA[<p>Mich würde mal interessieren ob Methodenaufrufe in der Initalisierungsliste Standardkonform sind, da das Objekt ja ansich eigentlich nicht fertig Konstruiert ist. Folgendes Beispiel:</p>
<pre><code class="language-cpp">class a
{
public:
	a(const char *t)
	{
		cout&lt;&lt;t&lt;&lt;endl;
	};
};

class b:public a
{
private:
	const char* func(const char *t)
	{
		return t;
	};
public:
	b(const char *t)
		:a(func(t))
	{};
};
</code></pre>
<p>Compiliert im VC++ 2008 ohne Probleme und Funktioneirt auch.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/253473/methode-in-initalisierungsliste-aufrufen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 13 Sep 2026 17:34:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/253473.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 02 Nov 2009 20:35:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Methode in Initalisierungsliste aufrufen on Mon, 02 Nov 2009 20:35:28 GMT]]></title><description><![CDATA[<p>Mich würde mal interessieren ob Methodenaufrufe in der Initalisierungsliste Standardkonform sind, da das Objekt ja ansich eigentlich nicht fertig Konstruiert ist. Folgendes Beispiel:</p>
<pre><code class="language-cpp">class a
{
public:
	a(const char *t)
	{
		cout&lt;&lt;t&lt;&lt;endl;
	};
};

class b:public a
{
private:
	const char* func(const char *t)
	{
		return t;
	};
public:
	b(const char *t)
		:a(func(t))
	{};
};
</code></pre>
<p>Compiliert im VC++ 2008 ohne Probleme und Funktioneirt auch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1802369</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802369</guid><dc:creator><![CDATA[Xebov]]></dc:creator><pubDate>Mon, 02 Nov 2009 20:35:28 GMT</pubDate></item><item><title><![CDATA[Reply to Methode in Initalisierungsliste aufrufen on Mon, 02 Nov 2009 20:48:57 GMT]]></title><description><![CDATA[<p>Sofern die Methoden nicht virtuell sind, ist alles okay. Funktionen gehören schliesslich nicht zur Instanz und sind somit auch nicht von deren Lebenszeit abhängig. Das Problem mit virtuellen Funktionen besteht jedoch darin, dass der <code>this</code> -Zeiger im Konstruktor noch nicht auf die richtige Instanz zeigt. Von daher sollte man von virtuellen Funktionsaufrufen im Konstruktor generell (nicht nur in der Initialisierungsliste) absehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1802381</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802381</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 02 Nov 2009 20:48:57 GMT</pubDate></item><item><title><![CDATA[Reply to Methode in Initalisierungsliste aufrufen on Mon, 02 Nov 2009 22:19:30 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Sofern die Methoden nicht virtuell sind, ist alles okay. Funktionen gehören schliesslich nicht zur Instanz und sind somit auch nicht von deren Lebenszeit abhängig. Das Problem mit virtuellen Funktionen besteht jedoch darin, dass der <code>this</code> -Zeiger im Konstruktor noch nicht auf die richtige Instanz zeigt. Von daher sollte man von virtuellen Funktionsaufrufen im Konstruktor generell (nicht nur in der Initialisierungsliste) absehen.</p>
</blockquote>
<p>Wirklich?! Ich dachte immer, dass der Aufruf virtueller Funktionen sicher und definiert ist, so lange es eine Implementierung in der Klasse selbst gibt. Es wird halt nur nicht eine überschriebene Version der Funktion aufgerufen, falls tatsächlich eine Unterklasse konstruiert wird. Oder irre ich mich?</p>
<p>Stefan.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1802423</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802423</guid><dc:creator><![CDATA[DStefan]]></dc:creator><pubDate>Mon, 02 Nov 2009 22:19:30 GMT</pubDate></item><item><title><![CDATA[Reply to Methode in Initalisierungsliste aufrufen on Mon, 02 Nov 2009 22:33:19 GMT]]></title><description><![CDATA[<p>Nein, das ist tatsächlich ein Problem. Stell dir vor, dass die Basisklasse zuerst (und das ist so) konstruiert wird, dann weiss die Klasse ja noch gar nicht, welche vituelle Funktion sie aufrufen soll, respektive das dazugehörige Objekt ist noch nicht erstellt worden.</p>
<p>Das selbe Problem gibt es bei der Zerstörung, da auch da keine verlässlichen Typinformationen mehr vorhanden sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1802435</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802435</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 02 Nov 2009 22:33:19 GMT</pubDate></item><item><title><![CDATA[Reply to Methode in Initalisierungsliste aufrufen on Mon, 02 Nov 2009 22:41:10 GMT]]></title><description><![CDATA[<p>Hmmmm - da möchte ich sicher sein, dass ich das auch verstanden habe. Also seht mal das hier:</p>
<pre><code class="language-cpp">class Base {
public:
   Base() {
      foo();
   }
   virtual void foo() {
      std::cout &lt;&lt; &quot;Base&quot; &lt;&lt; std::endl;
   }
};

class Sub {
public:
   virtual void foo() {
      std::cout &lt;&lt; &quot;Sub&quot; &lt;&lt; std::endl;
   }
};

int main() {
   Sub s;
   return 0;
}
</code></pre>
<p>Meine Meiung war (bisher?), dass in Base::Base() die vtbl noch nicht initialisiert ist, so dass das Programm &quot;Base&quot; ausgibt, obwohl ein Sub erstellt wird.</p>
<p>Schon klar, dass dies wahrscheinlich nicht das ist, was der Programmierer erwartet hat. Ich meinte aber (bisher?), dass der Aufruf legal und definiert ist (es muss Base::foo() aufgerufen werden). Eure Beiträge legen aber nahe, dass ein solcher Aufruf - ja was? - undefiniert ist.</p>
<p>Seid ihr euch sicher?</p>
<p>Stefan.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1802440</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802440</guid><dc:creator><![CDATA[DStefan]]></dc:creator><pubDate>Mon, 02 Nov 2009 22:41:10 GMT</pubDate></item><item><title><![CDATA[Reply to Methode in Initalisierungsliste aufrufen on Mon, 02 Nov 2009 23:09:54 GMT]]></title><description><![CDATA[<p>Ich gehe mal davon aus, dass Sub von Base erbt.</p>
<p>So, wie ich das sehe ist es nicht undefiniert (müsste aber auch im Standard genau nachschauen), aber es macht halt keinen Sinn, sondern verwirrt nur unnötig, da es so etwas, wie polymorphie zu diesem Stadium gar nicht geben kann, du aber durch einen virtuellen Aufur implizierst.</p>
<p>Also mit Vorbehalt:<br />
Das ist definierter Unsinn. <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/1802447</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802447</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 02 Nov 2009 23:09:54 GMT</pubDate></item><item><title><![CDATA[Reply to Methode in Initalisierungsliste aufrufen on Tue, 03 Nov 2009 07:48:57 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Ich gehe mal davon aus, dass Sub von Base erbt.</p>
</blockquote>
<p>Oh - ja - natürlich <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>drakon schrieb:</p>
<blockquote>
<p>So, wie ich das sehe ist es nicht undefiniert (müsste aber auch im Standard genau nachschauen), aber es macht halt keinen Sinn, sondern verwirrt nur unnötig, da es so etwas, wie polymorphie zu diesem Stadium gar nicht geben kann, du aber durch einen virtuellen Aufur implizierst.</p>
<p>Also mit Vorbehalt:<br />
Das ist definierter Unsinn. <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>Ja, das sollte man wohl nicht machen. Ich kann mir auch auf die Schnelle keinen Anwendungsfall vorstellen, wo die Nicht-Virtualität im Ctor einer ansonsten virtuellen Methode sinnvoll ist. Aber ich finde es schon wichtig zu wissen, ob ein solcher Aufruf <em>definiert</em> ist.</p>
<p>Wo wir schon einmal dabei sind. Du schreibst:</p>
<p>drakon schrieb:</p>
<blockquote>
<p>Das selbe Problem gibt es bei der Zerstörung, da auch da keine verlässlichen Typinformationen mehr vorhanden sind.</p>
</blockquote>
<p>... und hier habe ich meine Zweifel, ob das stimmt. Ich könnte also nicht in Base eine (protected) Methode cleanup() virtuell definieren und in Base::~Base() aufrufen, die Unterklassen einfach überschreiben, wenn sie auch etwas aufzuräumen haben?</p>
<p>Meines Wissens ist die vtbl im Dtor noch intakt, so dass ein solches cleanup() tadellos funktionieren müsste.</p>
<p>Stefan.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1802491</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802491</guid><dc:creator><![CDATA[DStefan]]></dc:creator><pubDate>Tue, 03 Nov 2009 07:48:57 GMT</pubDate></item><item><title><![CDATA[Reply to Methode in Initalisierungsliste aufrufen on Tue, 03 Nov 2009 08:45:09 GMT]]></title><description><![CDATA[<p>DStefan schrieb:</p>
<blockquote>
<p>Meines Wissens ist die vtbl im Dtor noch intakt, so dass ein solches cleanup() tadellos funktionieren müsste.</p>
</blockquote>
<p>Probiers doch aus:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Base
{
    protected:
        virtual void fun()
        {
            cout &lt;&lt; &quot;Base&quot; &lt;&lt; endl;
        }
    public:
        Base()
        {
            cout &lt;&lt; &quot;constructing Base&quot; &lt;&lt; endl;
            fun();
            cout &lt;&lt; &quot;--------&quot; &lt;&lt; endl;
        }
        ~Base()
        {
            cout &lt;&lt; &quot;destructing Base&quot; &lt;&lt; endl;
            fun();
            cout &lt;&lt; &quot;--------&quot; &lt;&lt; endl;
        }
};

class Derived : public Base
{
    protected:
        void fun()
        {
            cout &lt;&lt; &quot;Derived&quot; &lt;&lt; endl;
        }
    public:
        Derived()
        {
            cout &lt;&lt; &quot;constructing Derived&quot; &lt;&lt; endl;
            fun();
            cout &lt;&lt; &quot;--------&quot; &lt;&lt; endl;
        }
        ~Derived()
        {
            cout &lt;&lt; &quot;destructing Derived&quot; &lt;&lt; endl;
            fun();
            cout &lt;&lt; &quot;--------&quot; &lt;&lt; endl;
        }
};

int main()
{
    Derived d;
}
</code></pre>
<p>Ausgabe:</p>
<pre><code>./main
constructing Base
Base
--------
constructing Derived
Derived
--------
destructing Derived
Derived
--------
destructing Base
Base
--------
</code></pre>
<p>Ergo: auch im Destruktor sollte man sich auf virtuelle Funktionen nicht verlassen...</p>
<p>Wenn du eine virtuelle Funktion aufrufen willst und signalisieren, dass es genau diese eigene Implementierung sein soll, mach das doch so:</p>
<pre><code class="language-cpp">void Base::Base()
{
    Base::foo();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1802525</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802525</guid><dc:creator><![CDATA[nonne]]></dc:creator><pubDate>Tue, 03 Nov 2009 08:45:09 GMT</pubDate></item><item><title><![CDATA[Reply to Methode in Initalisierungsliste aufrufen on Tue, 03 Nov 2009 09:24:41 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Sofern die Methoden nicht virtuell sind, ist alles okay. Funktionen gehören schliesslich nicht zur Instanz und sind somit auch nicht von deren Lebenszeit abhängig. Das Problem mit virtuellen Funktionen besteht jedoch darin, dass der <code>this</code> -Zeiger im Konstruktor noch nicht auf die richtige Instanz zeigt. Von daher sollte man von virtuellen Funktionsaufrufen im Konstruktor generell (nicht nur in der Initialisierungsliste) absehen.</p>
</blockquote>
<p>Hmm, sind denn nicht virtuelle nicht statische Methoden nicht auch an den <code>this</code> -Zeiger der jeweiligen Instanz gebunden? Ohne Instanz lassen sie sich schließlich nicht aufrufen.<br />
Für sowas würde ich eher statische private Funktionen oder Funktionen die in der cpp-Datei verborgen sind benutzen. Sollte die Methode auf Member der Klasse zugreifen müssen, kann einem das genauso gut um die Ohren fliegen, wie bei der Benutzung von virtuellen Funktionen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1802550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802550</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Tue, 03 Nov 2009 09:24:41 GMT</pubDate></item><item><title><![CDATA[Reply to Methode in Initalisierungsliste aufrufen on Tue, 03 Nov 2009 11:36:27 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Hmm, sind denn nicht virtuelle nicht statische Methoden nicht auch an den <code>this</code> -Zeiger der jeweiligen Instanz gebunden? Ohne Instanz lassen sie sich schließlich nicht aufrufen.</p>
</blockquote>
<p>Doch, aufrufen lassen sie sich und es funktioniert auch solange gut, wie man keine Klassenmember benutzt (da sonst ja natürlich der 0 Zeiger dereferenziert wird). Ansonsten ist es ja lediglich ein Funktionsaufruf, mit einem Zeiger, auf die Instanz, welche halt einfach 0 ist, was nicht stört solange man den Zeiger nicht benutzt.</p>
<p>Habe da letztens was drüber geschrieben: (siehe 14.10.09)<br />
<a href="http://www.drakon.ch/" rel="nofollow">http://www.drakon.ch/</a></p>
<p>Als ich das geschrieben habe, habe ich im Standard eigentlich nichts gefunden, was dafür spricht, dass dieses Vorgehen undefiniertes Verhalten hervorruft. Aber es ist klar, dass es natürlich eigentlich rechter Unfug ist und man eher, wie du sagst statische Funktionen benutzen. (wird auch im Beitrag erwähnt).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1802610</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802610</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 03 Nov 2009 11:36:27 GMT</pubDate></item><item><title><![CDATA[Reply to Methode in Initalisierungsliste aufrufen on Tue, 03 Nov 2009 12:04:28 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Als ich das geschrieben habe, habe ich im Standard eigentlich nichts gefunden, was dafür spricht, dass dieses Vorgehen undefiniertes Verhalten hervorruft. Aber es ist klar, dass es natürlich eigentlich rechter Unfug ist und man eher, wie du sagst statische Funktionen benutzen. (wird auch im Beitrag erwähnt).</p>
</blockquote>
<p>undefiniert: 3.8/5 f. für nicht-POD-Klassen (wenn nur der Speicher angefordert wurde, aber kein Klassenobjekt existiert - dann ist es erst recht undefiniert, wenn nicht mal der Speicher angefordert wurde).</p>
<p>Explizit in 9.3.1/1</p>
<blockquote>
<p>If a nonstatic member function of a class X is called for an object that is not of type X, or of a type derived from X, the behavior is undefined.</p>
</blockquote>
<p>Das sollte keine Fragen offen lassen. Wiederum können wir den Erst-recht-Schluss wagen: wenn gar kein Objekt existiert (0-Pointer oder ungültiger Zeiger), ist es auch undefiniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1802620</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802620</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 03 Nov 2009 12:04:28 GMT</pubDate></item><item><title><![CDATA[Reply to Methode in Initalisierungsliste aufrufen on Tue, 03 Nov 2009 16:57:41 GMT]]></title><description><![CDATA[<p>Danke für die Hinweise!<br />
Ihr erweitert meinen Horizont <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>Stefan.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1802783</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802783</guid><dc:creator><![CDATA[DStefan]]></dc:creator><pubDate>Tue, 03 Nov 2009 16:57:41 GMT</pubDate></item><item><title><![CDATA[Reply to Methode in Initalisierungsliste aufrufen on Tue, 03 Nov 2009 18:37:09 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a>:<br />
Thx für die Info. Werde das bei Gelegenheit bei meinem Beitrag noch ergänzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1802826</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802826</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 03 Nov 2009 18:37:09 GMT</pubDate></item></channel></rss>