<?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[Virtuelle Funktion aus Konstruktor - hier well-defined?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich weiß, dass man im Konstruktor keine Funktionen aufrufen kann/soll, die in einer Kindklasse überschrieben werden. Was ist jedoch mit folgendem Konstrukt (Frage im Code):</p>
<pre><code>class Obj
{
  public:
  Obj() {};
  Obj(string filename) { LoadFromFile(filename); }
  void LoadFromFile(string filename) {
    // open file, check
    LoadContents(file);
  }

  virtual void LoadContents(FILE* f)
  {
    // Lade Basisdaten
  }
};

class DerObj : public Obj
{
  pubic:
  DerObj(string filename) : Obj()
  {
    LoadFromFile(filename);
  }

  virtual void LoadContents(FILE* f)
  {
    Obj::LoadContents(f);
    // lade extra-Daten
  }
};

int main()
{
  // Kann ich hier sicher sein, dass DerObj::LoadContents aufgerufen wird?
  unique_ptr&lt;Obj&gt;(new DerObj(&quot;datei.obj&quot;));
}
</code></pre>
<p>Vielen Dank für eure Hilfe,<br />
Maxi</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/321978/virtuelle-funktion-aus-konstruktor-hier-well-defined</link><generator>RSS for Node</generator><lastBuildDate>Sat, 18 Jul 2026 13:53:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/321978.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 01 Dec 2013 16:54:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Virtuelle Funktion aus Konstruktor - hier well-defined? on Sun, 01 Dec 2013 16:54:03 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich weiß, dass man im Konstruktor keine Funktionen aufrufen kann/soll, die in einer Kindklasse überschrieben werden. Was ist jedoch mit folgendem Konstrukt (Frage im Code):</p>
<pre><code>class Obj
{
  public:
  Obj() {};
  Obj(string filename) { LoadFromFile(filename); }
  void LoadFromFile(string filename) {
    // open file, check
    LoadContents(file);
  }

  virtual void LoadContents(FILE* f)
  {
    // Lade Basisdaten
  }
};

class DerObj : public Obj
{
  pubic:
  DerObj(string filename) : Obj()
  {
    LoadFromFile(filename);
  }

  virtual void LoadContents(FILE* f)
  {
    Obj::LoadContents(f);
    // lade extra-Daten
  }
};

int main()
{
  // Kann ich hier sicher sein, dass DerObj::LoadContents aufgerufen wird?
  unique_ptr&lt;Obj&gt;(new DerObj(&quot;datei.obj&quot;));
}
</code></pre>
<p>Vielen Dank für eure Hilfe,<br />
Maxi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2369240</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2369240</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Sun, 01 Dec 2013 16:54:03 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Funktion aus Konstruktor - hier well-defined? on Sun, 01 Dec 2013 17:04:22 GMT]]></title><description><![CDATA[<p>Ja, da kannst du dir sicher sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2369243</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2369243</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sun, 01 Dec 2013 17:04:22 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Funktion aus Konstruktor - hier well-defined? on Sun, 01 Dec 2013 17:11:26 GMT]]></title><description><![CDATA[<p>Ja, sobald die Initialisierungsliste abgeschlossen und der Inhalt des Konstruktors ausgeführt wird, ist es definiert.<br />
Ich hatte allerdings erst vor zwei Tagen das Problem, dass im Konstruktor einer Basisklasse eine virtuelle Funktion aufgerufen wurde. Das führte zu der Meldung &quot;pure virtual function called&quot;.</p>
<p>§10.4/6 schrieb:</p>
<blockquote>
<p>Member functions can be called from a constructor (or destructor) of an abstract class; the effect of making a virtual call (10.3) to a pure virtual function directly or indirectly for the object being created (or destroyed) from such a constructor (or destructor) is undefined.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2369245</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2369245</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sun, 01 Dec 2013 17:11:26 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Funktion aus Konstruktor - hier well-defined? on Sun, 01 Dec 2013 20:34:00 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>Ja, sobald die Initialisierungsliste abgeschlossen und der Inhalt des Konstruktors ausgeführt wird, ist es definiert.</p>
</blockquote>
<p>Es wäre vorher auch definiert. Nur würde dann <code>Obj::LoadContents</code> aufgerufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2369278</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2369278</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 01 Dec 2013 20:34:00 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Funktion aus Konstruktor - hier well-defined? on Sun, 01 Dec 2013 20:47:58 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Arcoth schrieb:</p>
<blockquote>
<p>Ja, sobald die Initialisierungsliste abgeschlossen und der Inhalt des Konstruktors ausgeführt wird, ist es definiert.</p>
</blockquote>
<p>Es wäre vorher auch definiert. Nur würde dann <code>Obj::LoadContents</code> aufgerufen.</p>
</blockquote>
<p>Dieses Forum ist so vorhersehbar.<br />
Ich hab mir schon gedacht, dass irgendeiner mit dieser Kleingikeit ankommt. :p</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2369283</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2369283</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sun, 01 Dec 2013 20:47:58 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Funktion aus Konstruktor - hier well-defined? on Sun, 01 Dec 2013 20:58:13 GMT]]></title><description><![CDATA[<p>Dieses Forum ist so vorhersehbar.<br />
War klar dass sich jemand darüber lustig machen wird, dass ein Fehler aufgezeigt wurde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2369286</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2369286</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 01 Dec 2013 20:58:13 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Funktion aus Konstruktor - hier well-defined? on Sun, 01 Dec 2013 21:02:57 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Dieses Forum ist so vorhersehbar.<br />
War klar dass sich jemand darüber lustig machen wird, dass ein Fehler aufgezeigt wurde.</p>
</blockquote>
<p>touché <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/2369287</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2369287</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sun, 01 Dec 2013 21:02:57 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Funktion aus Konstruktor - hier well-defined? on Sun, 01 Dec 2013 21:31:06 GMT]]></title><description><![CDATA[<blockquote>
<p>dass ein Fehler aufgezeigt wurde.</p>
</blockquote>
<p>Welcher Fehler? Ich habe nie bestritten, dass es vorher nicht definiert ist. Ich habe nur festgestellt, dass <em>wenn</em> der Rumpf des Konstruktors ausgeführt wird... .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2369290</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2369290</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sun, 01 Dec 2013 21:31:06 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Funktion aus Konstruktor - hier well-defined? on Sun, 01 Dec 2013 21:55:24 GMT]]></title><description><![CDATA[<p>@Arcoth und Nathan<br />
Selbst kreidet ihr nicht selten jedes noch so irrelevante Detail an, aber wenn mal jemand was Bedeutsames sagt (ja, wann man eine Funktion aufrufen darf, halte ich für nicht ganz unwesentlich), startet ihr eine völlig nutzlose Grundsatzdiskussion. Und dann noch sich jedes Mal für Fehler rechtzufertigen, obwohl niemand überhaupt auf die Idee käme, einen Vorwurf darin zu sehen.</p>
<p>Ist manchmal bemerkenswert, wie viele Posts wegen solcher Sinnlosdiskussionen entstehen und den Thread unnötig ins Offtopic treiben. Ich wäre sehr froh, wenn ihr etwas zurückhaltender posten könntet. Und Arcoth, man muss nicht ständig das letzte Wort zu allem haben -- du hast dauernd das Gefühl, dich beweisen zu müssen oder keine Fehler machen zu dürfen. Sieh doch das ein wenig lockerer; ist doch nichts dabei, wenn dein Post um eine Information ergänzt wird. Und wie gesagt sehe ich die Ergänzung hier durchaus als angebracht (im Gegensatz zu Posts, bei denen es nur um Rechthaberei oder Blossstellung geht).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2369291</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2369291</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 01 Dec 2013 21:55:24 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Funktion aus Konstruktor - hier well-defined? on Mon, 02 Dec 2013 06:15:27 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>@Arcoth und Nathan<br />
Selbst kreidet ihr nicht selten jedes noch so irrelevante Detail an, aber wenn mal jemand was Bedeutsames sagt (ja, wann man eine Funktion aufrufen darf, halte ich für nicht ganz unwesentlich), startet ihr eine völlig nutzlose Grundsatzdiskussion. Und dann noch sich jedes Mal für Fehler rechtzufertigen, obwohl niemand überhaupt auf die Idee käme, einen Vorwurf darin zu sehen.</p>
<p>Ist manchmal bemerkenswert, wie viele Posts wegen solcher Sinnlosdiskussionen entstehen und den Thread unnötig ins Offtopic treiben. Ich wäre sehr froh, wenn ihr etwas zurückhaltender posten könntet. Und Arcoth, man muss nicht ständig das letzte Wort zu allem haben -- du hast dauernd das Gefühl, dich beweisen zu müssen oder keine Fehler machen zu dürfen. Sieh doch das ein wenig lockerer; ist doch nichts dabei, wenn dein Post um eine Information ergänzt wird. Und wie gesagt sehe ich die Ergänzung hier durchaus als angebracht (im Gegensatz zu Posts, bei denen es nur um Rchthaberei oder Blossstellung geht).</p>
</blockquote>
<p>Da die Frage eh geklärt ist, mach ich das OT weiter, ach wenn ich mich damit rechtfef und genau dem Bild oben entspreche.<br />
Das, was hustbaer gesagt hatte, war komplett irrelevant.<br />
Wir alle wussten, was der TE mit welldefined meinte. Das das so oder so, defined ist, ist ein kleiner Missgebrauch von Fachbegriffen.<br />
Und ja, ich weiß, dass ich so etwas auch mache. Hätte ich auch getan. Ich finds nur witzug, dass sowas hier ständig passiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2369315</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2369315</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Mon, 02 Dec 2013 06:15:27 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Funktion aus Konstruktor - hier well-defined? on Mon, 02 Dec 2013 08:00:04 GMT]]></title><description><![CDATA[<p>Erstmal vielen Dank für die (ersten beiden <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="🙂"
    /> ) Antworten.</p>
<p>Also, werden die überschriebenen Funktionen dann aufgerufen, wenn die Initialisierungsliste abgearbeitet ist, man also im Rumpf des Konstruktors von der Klasse ist, in der die Funktion auch überschrieben wurde, ja?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2369321</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2369321</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Mon, 02 Dec 2013 08:00:04 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Funktion aus Konstruktor - hier well-defined? on Mon, 02 Dec 2013 11:27:59 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Das, was hustbaer gesagt hatte, war komplett irrelevant.<br />
Wir alle wussten, was der TE mit welldefined meinte. Das das so oder so, defined ist, ist ein kleiner Missgebrauch von Fachbegriffen.</p>
</blockquote>
<p>Genau genommen war das was Arcoth geschrieben hat vollkommen irrelevant. Weil es hier keine virtual pure Funktionen gibt.<br />
Deine Antwort dagegen war vollkommen OK. Kurz, ohne viele zusätzliche Details, aber zutreffend und IMO auch vollkommen ausreichend. Und die hab' ich ja auch nicht kommentiert/kritisiert/... .</p>
<p>Und es ist auch vollkommen unmöglich zu wissen was der TE mit &quot;welldefined&quot; gemeint hat, da der TE diesen Begriff nirgends verwendet hat.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/2470">@Maxi</a><br />
Ich kenne den Standard nicht auswendig, und werde jetzt auch nicht nachsehen, daher kann ich dir die passenden Fachausdrücke nicht liefern.<br />
Bei Einfachvererbung ist es auf jeden Fall so, dass die virtuellen Funktionen einer Klasse verwendet werden, sobald der Konstruktor-Rumpf dieser Klasse angefangen hat zu laufen. D.h. sobald alle Member der Klasse vollständig konstruiert wurden.<br />
Und beim Zerstören dann analog <em>bis</em> zu dem Zeitpunkt wo der Destruktor-Rumpf fertig abgearbeitet wurde, bzw. bis zu dem Zeitpunkt wo angefangen wird die Member zu zerstören.</p>
<p>Ob es bei Mehrfachvererbung und/oder virtueller Vererbung hier noch spezielle Dinge zu beachten gibt weiss ich nicht, müsste ich nachlesen.</p>
<p>Im Prinzip kannst du dir merken: die virtuellen Funktionen einer Klasse sind immer dann &quot;scharf&quot;, wenn sie sinnvoll aufgerufen werden können. Und das können sie natürlich nur, wenn alle Member der Klasse bereits konstruiert wurden und noch nicht wieder zerstört. Sonst könnte die Funktion ja nichtmal auf einzelne Member zugreifen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2369341</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2369341</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 02 Dec 2013 11:27:59 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Funktion aus Konstruktor - hier well-defined? on Mon, 02 Dec 2013 13:01:06 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Nathan schrieb:</p>
<blockquote>
<p>Das, was hustbaer gesagt hatte, war komplett irrelevant.<br />
Wir alle wussten, was der TE mit welldefined meinte. Das das so oder so, defined ist, ist ein kleiner Missgebrauch von Fachbegriffen.</p>
</blockquote>
<p>Genau genommen war das was Arcoth geschrieben hat vollkommen irrelevant. Weil es hier keine virtual pure Funktionen gibt.<br />
Deine Antwort dagegen war vollkommen OK. Kurz, ohne viele zusätzliche Details, aber zutreffend und IMO auch vollkommen ausreichend. Und die hab' ich ja auch nicht kommentiert/kritisiert/... .</p>
<p>Und es ist auch vollkommen unmöglich zu wissen was der TE mit &quot;welldefined&quot; gemeint hat, da der TE diesen Begriff nirgends verwendet hat.</p>
</blockquote>
<p>Ich bezog mich auch eher auf meinen zweiten Post, als ich mich darüber lustig gemacht habe, dass du eine irrelevante Kleinigkeit korriegiert hast.<br />
Wie gesagt, dass ist kein Vorwurf, ich hätte es auch getan, nur ist es mir erst im Nachhinein aufgefallen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2369349</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2369349</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Mon, 02 Dec 2013 13:01:06 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Funktion aus Konstruktor - hier well-defined? on Mon, 02 Dec 2013 19:12:02 GMT]]></title><description><![CDATA[<p>Maxi, manchmal ist es auch nützlich zu wissen, wie solche &quot;Limitationen&quot; umgangen werden können. Teilweise wollen Leute im Basisklassenkonstruktor eine virtuelle Funktion aufrufen, die erst später (in abgeleiteten Konstruktoren) vernünftig funktioniert. Man will/kann aber vielleicht nicht in jeder abgeleiteten Klasse diese Funktion aufrufen -- z.B. weil es einfach vergessen werden kann.</p>
<p>Die typische Möglichkeit ist hier eine Factory: Eine Funktion erzeugt ein Objekt der Klasse und stellt sicher, dass die notwendigen Operationen ausgeführt sind.</p>
<p>P.S.: Einigen wir uns alle auf weniger Irrelevanz <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2369429</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2369429</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 02 Dec 2013 19:12:02 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Funktion aus Konstruktor - hier well-defined? on Mon, 02 Dec 2013 19:37:41 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Die typische Möglichkeit ist hier eine Factory: Eine Funktion erzeugt ein Objekt der Klasse und stellt sicher, dass die notwendigen Operationen ausgeführt sind.</p>
</blockquote>
<p>Man nennt es auch Two Phase Construction <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>Und typischerweise wird dabei auch der Konstruktor private oder protected gemacht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2369441</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2369441</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 02 Dec 2013 19:37:41 GMT</pubDate></item></channel></rss>