<?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[[gelöst] virtuelle Funktion aus Konstruktor der abgeleiteten Klasse aufrufen. Sicher?]]></title><description><![CDATA[<p>Hallo,</p>
<p>wie jeder weiß, darf man in Basisklassenkonstruktoren keine virtuellen Funktionen aufrufen. Aber wie sieht das in Konstruktoren der abgeleiteten Klasse aus, wenn diese &quot;final&quot; ist (laut meinem Entwurf, was ich aber in C++ nicht enforcen kann)?</p>
<p>Beispiel:</p>
<pre><code class="language-cpp">class Base {
    virtual void foo() = 0;
};

class Derived: public Base {
    Derived() { foo(); }
    void foo() { printf(&quot;Hello&quot;); }
};
</code></pre>
<p>Kann ich davon ausgehen, dass der Konstruktor von Derived das &quot;richtige&quot; foo, also Derived::foo, aufruft?</p>
<p>Gruß,<br />
Phil</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/262432/gelöst-virtuelle-funktion-aus-konstruktor-der-abgeleiteten-klasse-aufrufen-sicher</link><generator>RSS for Node</generator><lastBuildDate>Sun, 06 Sep 2026 15:14:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/262432.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 05 Mar 2010 20:57:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [gelöst] virtuelle Funktion aus Konstruktor der abgeleiteten Klasse aufrufen. Sicher? on Sat, 06 Mar 2010 22:43:35 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>wie jeder weiß, darf man in Basisklassenkonstruktoren keine virtuellen Funktionen aufrufen. Aber wie sieht das in Konstruktoren der abgeleiteten Klasse aus, wenn diese &quot;final&quot; ist (laut meinem Entwurf, was ich aber in C++ nicht enforcen kann)?</p>
<p>Beispiel:</p>
<pre><code class="language-cpp">class Base {
    virtual void foo() = 0;
};

class Derived: public Base {
    Derived() { foo(); }
    void foo() { printf(&quot;Hello&quot;); }
};
</code></pre>
<p>Kann ich davon ausgehen, dass der Konstruktor von Derived das &quot;richtige&quot; foo, also Derived::foo, aufruft?</p>
<p>Gruß,<br />
Phil</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1864974</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1864974</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Sat, 06 Mar 2010 22:43:35 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] virtuelle Funktion aus Konstruktor der abgeleiteten Klasse aufrufen. Sicher? on Fri, 05 Mar 2010 22:07:39 GMT]]></title><description><![CDATA[<p><a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-261204-and-highlight-is-.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-261204-and-highlight-is-.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1864998</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1864998</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Fri, 05 Mar 2010 22:07:39 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] virtuelle Funktion aus Konstruktor der abgeleiteten Klasse aufrufen. Sicher? on Fri, 05 Mar 2010 22:50:13 GMT]]></title><description><![CDATA[<p>Beim Eintritt in den Konstruktor-Rumpf ist dein Objekt fertig initialisiert - es ist ein Derived. Somit sollte auch das richtige foo() aufgeufen werden.<br />
Sonst könntest du ja auch keine nicht-virtuellen Member von Derived im Konstruktor aufrufen.</p>
<p>Nur wenn du jetzt von Derived nochmal ableitest (weil du später mal nichtmehr dran denkst dass foo virtual ist und inm Konstruktor von Derived aufgerufen wird) bekommst du das übliche nicht gewollte Verhalten, dass in Derived2() plötzlich Derived::foo() ausgeführt wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1865018</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1865018</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Fri, 05 Mar 2010 22:50:13 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] virtuelle Funktion aus Konstruktor der abgeleiteten Klasse aufrufen. Sicher? on Sat, 06 Mar 2010 22:43:19 GMT]]></title><description><![CDATA[<p>Okay, also genau wie ich gedacht habe.<br />
Mir fehlt das &quot;final&quot; Keyword in C++. Muss ich wohl SEHR gut dokumentieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1865297</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1865297</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Sat, 06 Mar 2010 22:43:19 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] virtuelle Funktion aus Konstruktor der abgeleiteten Klasse aufrufen. Sicher? on Sat, 06 Mar 2010 23:51:24 GMT]]></title><description><![CDATA[<p>PhilippM schrieb:</p>
<blockquote>
<p>Okay, also genau wie ich gedacht habe.<br />
Mir fehlt das &quot;final&quot; Keyword in C++. Muss ich wohl SEHR gut dokumentieren.</p>
</blockquote>
<p>Tipp:</p>
<pre><code class="language-cpp">class Base { 
    virtual void foo() = 0; 
}; 

class Derived: public Base { 
    Derived() { doFoo(); } 
    void doFoo() { std::cout &lt;&lt; &quot;Hello&quot;; }
    virtual void foo() { doFoo(); } 
};
</code></pre>
<p>Schon brauchst du kein <code>final</code> mehr und man kann gefahrlos davon ableiten.</p>
<p>Wozu final bei Klassen überhaupt verwenden? Habe bisher kaum einen sinnvollen Einsatz gesehen ... um ehrlich zu sein nicht mal einen einzigen.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1865313</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1865313</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 06 Mar 2010 23:51:24 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] virtuelle Funktion aus Konstruktor der abgeleiteten Klasse aufrufen. Sicher? on Sun, 07 Mar 2010 00:08:43 GMT]]></title><description><![CDATA[<p><a href="http://msdn.microsoft.com/de-de/library/ms173150(VS.80).aspx" rel="nofollow">http://msdn.microsoft.com/de-de/library/ms173150(VS.80).aspx</a> schrieb:</p>
<blockquote>
<p>Eine versiegelte Klasse kann nicht als Basisklasse verwendet werden. Aus diesem Grund kann sie auch keine abstrakte Klasse sein. Versiegelte Klassen werden hauptsächlich verwendet, um Ableitungen zu verhindern. Weil sie nicht als Basisklasse verwendet werden können, können Aufrufe an versiegelte Klassenmember durch Laufzeitoptimierungen etwas beschleunigt werden.</p>
</blockquote>
<p>Findet man bei .NET und Java.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1865320</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1865320</guid><dc:creator><![CDATA[Zeus]]></dc:creator><pubDate>Sun, 07 Mar 2010 00:08:43 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] virtuelle Funktion aus Konstruktor der abgeleiteten Klasse aufrufen. Sicher? on Sun, 07 Mar 2010 00:47:17 GMT]]></title><description><![CDATA[<p>Zeus schrieb:</p>
<blockquote>
<p><a href="http://msdn.microsoft.com/de-de/library/ms173150(VS.80).aspx" rel="nofollow">http://msdn.microsoft.com/de-de/library/ms173150(VS.80).aspx</a> schrieb:</p>
<blockquote>
<p>Eine versiegelte Klasse kann nicht als Basisklasse verwendet werden. Aus diesem Grund kann sie auch keine abstrakte Klasse sein. Versiegelte Klassen werden hauptsächlich verwendet, um Ableitungen zu verhindern. Weil sie nicht als Basisklasse verwendet werden können, können Aufrufe an versiegelte Klassenmember durch Laufzeitoptimierungen etwas beschleunigt werden.</p>
</blockquote>
<p>Findet man bei .NET und Java.</p>
</blockquote>
<p>Ich weiss schon was <code>final</code> oder <code>sealed</code> tun, nur ob es sinnvolle Einsatzgebiete gibt, wage ich sehr stark zu bezweifeln. Im allgemeinen liest man nur überall immer wieder:<br />
&quot;Aus unerklärlichen Gründen wurde die Klasse als final/sealed deklariert, wodurch dies und das nun nicht möglich ist und ein grosser Umweg gemacht werden muss.&quot;</p>
<p>Das Problem liegt darin, dass der Entwickler gar nicht sinnvoll beurteilen kann, ob von seiner Klasse abgeleitet werden wird oder nicht.</p>
<p>Dass .Net dann von einem leichten Performancegewinn spricht, macht die Sache nicht gerade besser, sondern macht sie eher lächerlich. Einen <strong>leichten</strong> Performancegewinn wird in .Net wohl kaum ins Gewicht fallen. Dafür verhindert man die Erweiterbarkeit der Klasse. Wie gesagt, ich habe noch nie einen sinnvollen Einsatz gesehen. Falls mir den jemand aufzeigen könnte, wäre ich dankbar.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1865322</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1865322</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sun, 07 Mar 2010 00:47:17 GMT</pubDate></item></channel></rss>