<?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[Überschriebene virtuelle Funktion: virtuell oder nicht?]]></title><description><![CDATA[<p>Sowohl</p>
<pre><code class="language-cpp">class Base {
    virtual void foo() {std::cout &lt;&lt; &quot;base&quot;;}
};
class Derived : Base {
    void foo() {std::cout &lt;&lt; &quot;derived&quot;;}
};
</code></pre>
<p>als auch</p>
<pre><code class="language-cpp">class Base {
    virtual void foo() {std::cout &lt;&lt; &quot;base&quot;;}
};
class Derived : Base{
    virtual void foo() {std::cout &lt;&lt; &quot;derived&quot;;}
};
</code></pre>
<p>überschreibt in Derived die Funktion Base::foo.</p>
<p>In einer Klasse Derived2, die von Derived ableitet, könnte ich ja nach wie vor foo von Base überschreiben. Haben diese beiden Syntaxen einen praktischen Unterschied?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/300076/überschriebene-virtuelle-funktion-virtuell-oder-nicht</link><generator>RSS for Node</generator><lastBuildDate>Wed, 12 Aug 2026 22:51:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/300076.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 24 Feb 2012 17:25:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Überschriebene virtuelle Funktion: virtuell oder nicht? on Fri, 24 Feb 2012 17:25:59 GMT]]></title><description><![CDATA[<p>Sowohl</p>
<pre><code class="language-cpp">class Base {
    virtual void foo() {std::cout &lt;&lt; &quot;base&quot;;}
};
class Derived : Base {
    void foo() {std::cout &lt;&lt; &quot;derived&quot;;}
};
</code></pre>
<p>als auch</p>
<pre><code class="language-cpp">class Base {
    virtual void foo() {std::cout &lt;&lt; &quot;base&quot;;}
};
class Derived : Base{
    virtual void foo() {std::cout &lt;&lt; &quot;derived&quot;;}
};
</code></pre>
<p>überschreibt in Derived die Funktion Base::foo.</p>
<p>In einer Klasse Derived2, die von Derived ableitet, könnte ich ja nach wie vor foo von Base überschreiben. Haben diese beiden Syntaxen einen praktischen Unterschied?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185319</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185319</guid><dc:creator><![CDATA[Kaktus]]></dc:creator><pubDate>Fri, 24 Feb 2012 17:25:59 GMT</pubDate></item><item><title><![CDATA[Reply to Überschriebene virtuelle Funktion: virtuell oder nicht? on Fri, 24 Feb 2012 17:29:13 GMT]]></title><description><![CDATA[<p>Kaktus schrieb:</p>
<blockquote>
<p>Haben diese beiden Syntaxen einen praktischen Unterschied?</p>
</blockquote>
<p>Js. Man sieht sofort beim Blick auf Derived, dass foo virtual ist und muss sich nicht durch die gesamte Vererbungshierarchie hangeln, um zu gucken, ob irgendwo ein virtual steht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185320</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185320</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 24 Feb 2012 17:29:13 GMT</pubDate></item><item><title><![CDATA[Reply to Überschriebene virtuelle Funktion: virtuell oder nicht? on Fri, 24 Feb 2012 17:36:19 GMT]]></title><description><![CDATA[<p>Danke. Aber technisch sind sie identisch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185323</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185323</guid><dc:creator><![CDATA[Kaktus]]></dc:creator><pubDate>Fri, 24 Feb 2012 17:36:19 GMT</pubDate></item><item><title><![CDATA[Reply to Überschriebene virtuelle Funktion: virtuell oder nicht? on Fri, 24 Feb 2012 17:37:39 GMT]]></title><description><![CDATA[<p>Kaktus schrieb:</p>
<blockquote>
<pre><code class="language-cpp">class Base {
    virtual void foo() {std::cout &lt;&lt; &quot;base&quot;;}
};
class Derived : Base {
    void foo() {std::cout &lt;&lt; &quot;derived&quot;;}
};
</code></pre>
</blockquote>
<p>Weil foo in Base virtual ist, bekommt foo in Derived automatisch das virtual spendiert, ohne dass du es angegeben hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185324</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185324</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 24 Feb 2012 17:37:39 GMT</pubDate></item><item><title><![CDATA[Reply to Überschriebene virtuelle Funktion: virtuell oder nicht? on Fri, 24 Feb 2012 17:39:49 GMT]]></title><description><![CDATA[<p>Oder : einmal virtuell, immer virtuell. Trotzdem sollte es hingeschrieben werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185325</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185325</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Fri, 24 Feb 2012 17:39:49 GMT</pubDate></item><item><title><![CDATA[Reply to Überschriebene virtuelle Funktion: virtuell oder nicht? on Fri, 24 Feb 2012 17:42:46 GMT]]></title><description><![CDATA[<p>Kaktus schrieb:</p>
<blockquote>
<p>Danke. Aber technisch sind sie identisch?</p>
</blockquote>
<p>Ja.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185327</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185327</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 24 Feb 2012 17:42:46 GMT</pubDate></item><item><title><![CDATA[Reply to Überschriebene virtuelle Funktion: virtuell oder nicht? on Fri, 24 Feb 2012 18:30:40 GMT]]></title><description><![CDATA[<p>Alternativ könnte man auch das override keyword benutzen (falls verfügbar), das würde für mich mehr Sinn ergeben.</p>
<p>Ist es allerdings nicht so, dass ein Aufruf von foo einer von Derived abgeleiteten Klasse mit einem Pointer auf Derived im ersten Beispiel Derived::foo aufruft, statt die Funktion der von Derived abgeleiteten Klasse? Im zweiten Beispiel sollte es doch korrekt laufen, oder irre ich mich da? Ist schon eine Weile her.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185342</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185342</guid><dc:creator><![CDATA[Cachus]]></dc:creator><pubDate>Fri, 24 Feb 2012 18:30:40 GMT</pubDate></item><item><title><![CDATA[Reply to Überschriebene virtuelle Funktion: virtuell oder nicht? on Fri, 24 Feb 2012 18:36:26 GMT]]></title><description><![CDATA[<p>Cachus schrieb:</p>
<blockquote>
<p>Ist es allerdings nicht so, dass ein Aufruf von foo einer von Derived abgeleiteten Klasse mit einem Pointer auf Derived im ersten Beispiel Derived::foo aufruft</p>
</blockquote>
<p>Meinst du das?</p>
<pre><code class="language-cpp">class Base {
    virtual void foo() {std::cout &lt;&lt; &quot;base&quot;;}
};
class Derived : Base {
    void foo() {std::cout &lt;&lt; &quot;derived&quot;;}
};
</code></pre>
<p>Nö. Einmal virtuell, immer virtuell.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

struct Base
{
    virtual void foo() {std::cout &lt;&lt; &quot;base&quot;;}
};

struct Derived : Base
{
    void foo() {std::cout &lt;&lt; &quot;derived&quot;;}
};

struct SecondDerived : Derived
{
    void foo() {std::cout &lt;&lt; &quot;second-derived&quot;;}
};

int main()
{
    Base* a = new SecondDerived;
    a-&gt;foo();
}
</code></pre>
<p><a href="http://codepad.org/rynUjEQA" rel="nofollow">http://codepad.org/rynUjEQA</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185344</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185344</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 24 Feb 2012 18:36:26 GMT</pubDate></item><item><title><![CDATA[Reply to Überschriebene virtuelle Funktion: virtuell oder nicht? on Fri, 24 Feb 2012 18:37:56 GMT]]></title><description><![CDATA[<p>Cachus schrieb:</p>
<blockquote>
<p>Alternativ könnte man auch das override keyword benutzen (falls verfügbar), das würde für mich mehr Sinn ergeben.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /><br />
Es gibt auch Compiler-Fehler, falls keine Funktion überschrieben werden kann. Allerdings fehlt mir der GCC-Support (wenn ich mich da nicht irre).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185346</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185346</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 24 Feb 2012 18:37:56 GMT</pubDate></item><item><title><![CDATA[Reply to Überschriebene virtuelle Funktion: virtuell oder nicht? on Fri, 24 Feb 2012 18:53:44 GMT]]></title><description><![CDATA[<p>Ich meinte das eher so:</p>
<pre><code class="language-cpp">class Base
{
public:
	virtual void foo() {std::cout &lt;&lt; &quot;Base&quot;;}
};

class Derived : public Base
{
public:
	void foo() {std::cout &lt;&lt; &quot;Derived&quot;;}
};

class Derived2 : public Derived
{
public:
	void foo() {std::cout &lt;&lt; &quot;Derived 2&quot;;}
};

int main(int argc, char *argv[])
{
	Derived2 d2;
	Derived* d = &amp;d2;
	d-&gt;foo();
}
</code></pre>
<p>Das gibt bei mir tatsächlich korrekt &quot;Derived 2&quot; aus, ist wohl doch schon länger her als ich dachte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185351</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185351</guid><dc:creator><![CDATA[Cachus]]></dc:creator><pubDate>Fri, 24 Feb 2012 18:53:44 GMT</pubDate></item><item><title><![CDATA[Reply to Überschriebene virtuelle Funktion: virtuell oder nicht? on Fri, 24 Feb 2012 19:05:55 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>wird eine Basisklasse angelegt die mindestens einen virtuellen Member hat,<br />
so erzeugt der Kompiler für die Basisklasse, und folgend alle abgeleiteten<br />
Klassen, eine Tabelle mit Addresseinträgen der, in der Basisklasse als virtuell<br />
deklarierten, Methoden (auch virtuelle Tabelle genannt).</p>
<p>Wird ein Derivat instanziiert bekommt diese die virtuelle Tabelle mit den<br />
aktuellen Adresseinträgen (Im Basisklassensegment). Diese Tabelle entspricht auch einer Jumptable.</p>
<p>Beispiel:<br />
(skizzenhaft)</p>
<pre><code class="language-cpp">class Base
{
public:
virtual void foo() 
{ 
__debugbreak();
};
void bar() 
{
__debugbreak();
};
};

class Derived:public Base
{

void foo () 
{
__debugbreak();
};
void bar() 
{
__debugbreak();
};
};

void func_a(Base&amp; blub)
{
blub.foo(); // wird durch derived ausgeführt
blub.bar(); // wird durch base ausgeführt
};

int _tmain(int argc, _TCHAR* argv[])
{
	Base b;
	Derived d;
	func_a(d);
	__debugbreak();

	return 0;
}
</code></pre>
<p>Der Vorteil von Virtuellen Klassen ist, das diese überladene Methoden<br />
des Derivats aus der Basis heraus aufrufen kannst, und das nur durch<br />
die virtuelle Tabelle.<br />
Die virtuelle Tabelle liegt vor dem eigentlichen datensegment<br />
der instanz, also vor dem ersten Member.</p>
<p>grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185358</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185358</guid><dc:creator><![CDATA[zeusosc]]></dc:creator><pubDate>Fri, 24 Feb 2012 19:05:55 GMT</pubDate></item><item><title><![CDATA[Reply to Überschriebene virtuelle Funktion: virtuell oder nicht? on Fri, 24 Feb 2012 19:08:33 GMT]]></title><description><![CDATA[<p>zeusosc schrieb:</p>
<blockquote>
<p><s>Virtuellen</s> Klassen</p>
</blockquote>
<p>Polymorphen Klassen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185359</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185359</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 24 Feb 2012 19:08:33 GMT</pubDate></item><item><title><![CDATA[Reply to Überschriebene virtuelle Funktion: virtuell oder nicht? on Fri, 24 Feb 2012 19:15:25 GMT]]></title><description><![CDATA[<p>Kurze Ergänzung: Die &quot;virtuelle Tabelle&quot; nennen AFAIK die meisten Compiler <code>vtable</code> , die fachsprachliche Abkürzung ist VMT (VirtualMethodTable). Einige Compiler liefern Fehler wie</p>
<blockquote>
<p>undefined reference to `vtable for VintagePort'</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2185360</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185360</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 24 Feb 2012 19:15:25 GMT</pubDate></item><item><title><![CDATA[Reply to Überschriebene virtuelle Funktion: virtuell oder nicht? on Fri, 24 Feb 2012 19:14:10 GMT]]></title><description><![CDATA[<p>Japp und Japp <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/2185361</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185361</guid><dc:creator><![CDATA[zeusosc]]></dc:creator><pubDate>Fri, 24 Feb 2012 19:14:10 GMT</pubDate></item><item><title><![CDATA[Reply to Überschriebene virtuelle Funktion: virtuell oder nicht? on Fri, 24 Feb 2012 20:23:12 GMT]]></title><description><![CDATA[<p>Hoffentlich gibts im neuen C++ Standard eine Möglichkeit nur Entpolymorphisierung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185380</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185380</guid><dc:creator><![CDATA[xcall]]></dc:creator><pubDate>Fri, 24 Feb 2012 20:23:12 GMT</pubDate></item><item><title><![CDATA[Reply to Überschriebene virtuelle Funktion: virtuell oder nicht? on Fri, 24 Feb 2012 20:26:31 GMT]]></title><description><![CDATA[<p>Du meinst, eine virtuelle Funktion in abgeleiteten Klassen nicht mehr virtuell zu machen? Falls ja, was sollte das bringen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185382</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185382</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 24 Feb 2012 20:26:31 GMT</pubDate></item><item><title><![CDATA[Reply to Überschriebene virtuelle Funktion: virtuell oder nicht? on Sat, 25 Feb 2012 07:49:14 GMT]]></title><description><![CDATA[<p>Weil nicht-polymorphistische Methoden schneller im Aufruf sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185476</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185476</guid><dc:creator><![CDATA[xcall]]></dc:creator><pubDate>Sat, 25 Feb 2012 07:49:14 GMT</pubDate></item><item><title><![CDATA[Reply to Überschriebene virtuelle Funktion: virtuell oder nicht? on Sat, 25 Feb 2012 10:42:40 GMT]]></title><description><![CDATA[<p>xcall schrieb:</p>
<blockquote>
<p>Weil nicht-polymorphistische Methoden schneller im Aufruf sind.</p>
</blockquote>
<p>Nicht, wenn du es deinem Compiler nicht explizit verbietest, schlau zu sein.</p>
<p>Der gcc macht mir die virtuelle Funktion sogar inline, wenn er schnallt, dass kein late binding stattfindet. Das fand ich echt krass.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185527</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185527</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sat, 25 Feb 2012 10:42:40 GMT</pubDate></item><item><title><![CDATA[Reply to Überschriebene virtuelle Funktion: virtuell oder nicht? on Sat, 25 Feb 2012 11:36:48 GMT]]></title><description><![CDATA[<p>xcall schrieb:</p>
<blockquote>
<p>Weil nicht-polymorphistische Methoden schneller im Aufruf sind.</p>
</blockquote>
<p>Du kannst aber dennoch nicht einfach die Semantik ändern. Wenn die Funktion in der abgeleiteten Klasse nicht mehr virtuell wäre, aber über eine Basisklasse aufgerufen würde, was sollte dann passieren?</p>
<p>Erkläre das Ganze bitte ausführlicher. Bisher macht es eher den Anschein, dass du ein total unnützes Feature verfechtest, nur weil dir Performance-Mythen Angst machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185541</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185541</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 25 Feb 2012 11:36:48 GMT</pubDate></item><item><title><![CDATA[Reply to Überschriebene virtuelle Funktion: virtuell oder nicht? on Sat, 25 Feb 2012 17:53:38 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>xcall schrieb:</p>
<blockquote>
<p>Weil nicht-polymorphistische Methoden schneller im Aufruf sind.</p>
</blockquote>
<p>Du kannst aber dennoch nicht einfach die Semantik ändern. Wenn die Funktion in der abgeleiteten Klasse nicht mehr virtuell wäre, aber über eine Basisklasse aufgerufen würde, was sollte dann passieren?</p>
<p>Erkläre das Ganze bitte ausführlicher. Bisher macht es eher den Anschein, dass du ein total unnützes Feature verfechtest, nur weil dir Performance-Mythen Angst machen.</p>
</blockquote>
<p>Ich denke, es ist so gemeint, wie ich es ursprünglich im Kopf hatte: Dass der virtuelle Aufruf nur stattfindet, wenn die Funktion in Klasse X des Pointers auf X noch virtuell ist, was dem Compiler als Optimierungshilfe dient. Es macht ja wenig Sinn, einen virtual function call durchzuführen, wenn bekannt ist, dass es keine überschreibung gibt.<br />
Ist allerdings fragwürdig, ob das allein ausreicht um so ein Feature einzuführen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185724</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185724</guid><dc:creator><![CDATA[Cachus]]></dc:creator><pubDate>Sat, 25 Feb 2012 17:53:38 GMT</pubDate></item><item><title><![CDATA[Reply to Überschriebene virtuelle Funktion: virtuell oder nicht? on Sun, 26 Feb 2012 01:55:54 GMT]]></title><description><![CDATA[<p>Cachus schrieb:</p>
<blockquote>
<p>Ist allerdings fragwürdig, ob das allein ausreicht um so ein Feature einzuführen.</p>
</blockquote>
<p>Da Compiler diese Optimierung schon heute ohne dieses &quot;Feature&quot; durchführen, wohl eher nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185858</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185858</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 26 Feb 2012 01:55:54 GMT</pubDate></item><item><title><![CDATA[Reply to Überschriebene virtuelle Funktion: virtuell oder nicht? on Sun, 26 Feb 2012 20:29:47 GMT]]></title><description><![CDATA[<p>Auch wenn ein Compiler nicht alle Fälle optimieren kann, ist es wenigstens möglich den virtuellen Aufruf zu unterdrücken ( derivedObject.Base::foo() ), womit die Idee der &quot;Entpolymorphisierung&quot; allerdings hinfällig währe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2186046</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2186046</guid><dc:creator><![CDATA[Cachus]]></dc:creator><pubDate>Sun, 26 Feb 2012 20:29:47 GMT</pubDate></item></channel></rss>