<?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[Was hat virtual für einen Sinn?]]></title><description><![CDATA[<p>Ich habe mir diese zwei Texte über virtuelle Methoden durchgelesen. Aber den Sinn verstehe ich immer noch nicht:</p>
<p><a href="http://tutorial.schornboeck.net/virtual.htm" rel="nofollow">http://tutorial.schornboeck.net/virtual.htm</a><br />
<a href="http://de.wikibooks.org/wiki/C%2B%2B-Programmierung:_Polymorphie" rel="nofollow">http://de.wikibooks.org/wiki/C%2B%2B-Programmierung:_Polymorphie</a></p>
<p>Ein Beispiel:</p>
<pre><code>class Base
{
public:
   void foo() {printf(&quot;Base::foo\n&quot;);}
};

class Derived : public Base
{
public:
   void foo() {printf(&quot;Derived::foo\n&quot;);}
};

int main()
{
   Derived d;
   d.foo();
}
</code></pre>
<p>Warum sollte ich hier virtual verwenden?</p>
<pre><code>class Base
{
public:
   virtual void foo() {printf(&quot;Base::foo\n&quot;);}
};
</code></pre>
<p>Wenn ich den Code ausführe, kommt für beide Methoden das selbe heraus. Also warum das langsame virtual verwenden???</p>
<p>Danke für eure Hilfe und entschuldigt die Noobfrage ^^!</p>
<p>Mit freundlichen Grüßen,<br />
C_Cheaf</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/261727/was-hat-virtual-für-einen-sinn</link><generator>RSS for Node</generator><lastBuildDate>Mon, 07 Sep 2026 02:47:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/261727.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 23 Feb 2010 07:59:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Was hat virtual für einen Sinn? on Tue, 23 Feb 2010 07:59:07 GMT]]></title><description><![CDATA[<p>Ich habe mir diese zwei Texte über virtuelle Methoden durchgelesen. Aber den Sinn verstehe ich immer noch nicht:</p>
<p><a href="http://tutorial.schornboeck.net/virtual.htm" rel="nofollow">http://tutorial.schornboeck.net/virtual.htm</a><br />
<a href="http://de.wikibooks.org/wiki/C%2B%2B-Programmierung:_Polymorphie" rel="nofollow">http://de.wikibooks.org/wiki/C%2B%2B-Programmierung:_Polymorphie</a></p>
<p>Ein Beispiel:</p>
<pre><code>class Base
{
public:
   void foo() {printf(&quot;Base::foo\n&quot;);}
};

class Derived : public Base
{
public:
   void foo() {printf(&quot;Derived::foo\n&quot;);}
};

int main()
{
   Derived d;
   d.foo();
}
</code></pre>
<p>Warum sollte ich hier virtual verwenden?</p>
<pre><code>class Base
{
public:
   virtual void foo() {printf(&quot;Base::foo\n&quot;);}
};
</code></pre>
<p>Wenn ich den Code ausführe, kommt für beide Methoden das selbe heraus. Also warum das langsame virtual verwenden???</p>
<p>Danke für eure Hilfe und entschuldigt die Noobfrage ^^!</p>
<p>Mit freundlichen Grüßen,<br />
C_Cheaf</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1859893</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1859893</guid><dc:creator><![CDATA[C_Cheaf]]></dc:creator><pubDate>Tue, 23 Feb 2010 07:59:07 GMT</pubDate></item><item><title><![CDATA[Reply to Was hat virtual für einen Sinn? on Tue, 23 Feb 2010 08:02:28 GMT]]></title><description><![CDATA[<p>versuch mal das in der main:</p>
<pre><code class="language-cpp">int main()
{
   Base* b=new Derived();
   b-&gt;foo();
   delete b;
}
</code></pre>
<p>was ist die Ausgabe?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1859895</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1859895</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Tue, 23 Feb 2010 08:02:28 GMT</pubDate></item><item><title><![CDATA[Reply to Was hat virtual für einen Sinn? on Tue, 23 Feb 2010 10:50:20 GMT]]></title><description><![CDATA[<p>Ok jetzt wird die Methode von Base ausgeführt. Aber warum sollte ich als Pointer Base* verwenden und nicht Derived* ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1859970</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1859970</guid><dc:creator><![CDATA[C_Cheaf]]></dc:creator><pubDate>Tue, 23 Feb 2010 10:50:20 GMT</pubDate></item><item><title><![CDATA[Reply to Was hat virtual für einen Sinn? on Tue, 23 Feb 2010 10:52:44 GMT]]></title><description><![CDATA[<p>C_Cheaf schrieb:</p>
<blockquote>
<p>Ok jetzt wird die Methode von Base ausgeführt. Aber warum sollte ich als Pointer Base* verwenden und nicht Derived* ?</p>
</blockquote>
<p>Mach doch mal in Base die Methode &quot;foo&quot; virtual, und schau was passiert...<br />
Stichwort Polymorphie, Basisklassenzeiger.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1859976</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1859976</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Tue, 23 Feb 2010 10:52:44 GMT</pubDate></item><item><title><![CDATA[Reply to Was hat virtual für einen Sinn? on Tue, 23 Feb 2010 10:53:18 GMT]]></title><description><![CDATA[<p>C_Cheaf schrieb:</p>
<blockquote>
<p>Ok jetzt wird die Methode von Base ausgeführt. Aber warum sollte ich als Pointer Base* verwenden und nicht Derived* ?</p>
</blockquote>
<p>Abstraktion. Du willst dir schliesslich die Möglichkeit erhalten, später auf <code>AnotherDerived</code> zu zeigen, ohne die Schnittstelle ändern zu müssen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1859977</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1859977</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 23 Feb 2010 10:53:18 GMT</pubDate></item><item><title><![CDATA[Reply to Was hat virtual für einen Sinn? on Tue, 23 Feb 2010 11:57:47 GMT]]></title><description><![CDATA[<p>Est ist einfach viel leichter und nicht so aufwendog.<br />
Hast du später zim beispiel noch mehrere von base abgeleitete klassen die alle eigentlich ne gleiche funktion haben.<br />
Bzw halt mit einer anderen implementierung, kannst grad ein zeiger auf base an eine funktion ubergeben und diese ruft dann automatisch die richtige funktion auf.<br />
Ist ja leichter als in der funktion dann jede möglichkeit reinzuschreiben.</p>
<p>Hoffe du verstehst was ich mein;-)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860014</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860014</guid><dc:creator><![CDATA[fr33g]]></dc:creator><pubDate>Tue, 23 Feb 2010 11:57:47 GMT</pubDate></item><item><title><![CDATA[Reply to Was hat virtual für einen Sinn? on Tue, 23 Feb 2010 12:15:42 GMT]]></title><description><![CDATA[<p>Ok ich glaube jetzt habe ich es verstand.</p>
<p>Ist es eigentlich sinnvoll immer, sobald es möglich ist, virtu einzusetzen ein zusetzten, oder nur dann, wenn es wirklich nötig ist? Denn virtual macht die Sache wegen der Tabelle mit den virtuellen Methoden doch langsamer, oder nicht?</p>
<p>Wenn man nun zum Beispiel DirectX Programme schreiben will, ist es doch äußerst wichtig nicht unnötig Ressourcen zu verblasen. Eignet sich für zeitkritische Anwendungen objektorientierte Programmierung überhaupt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860024</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860024</guid><dc:creator><![CDATA[C_Cheaf]]></dc:creator><pubDate>Tue, 23 Feb 2010 12:15:42 GMT</pubDate></item><item><title><![CDATA[Reply to Was hat virtual für einen Sinn? on Tue, 23 Feb 2010 12:25:43 GMT]]></title><description><![CDATA[<p>C_Cheaf schrieb:</p>
<blockquote>
<p>Ist es eigentlich sinnvoll immer, sobald es möglich ist, virtu einzusetzen ein zusetzten, oder nur dann, wenn es wirklich nötig ist? Denn virtual macht die Sache wegen der Tabelle mit den virtuellen Methoden doch langsamer, oder nicht?</p>
</blockquote>
<p>Genau. Deshalb sollte man <code>virtual</code> auch nur einsetzen, wo es wirklich notwendig ist. <strong>Ganz wichtig</strong> ist zu wissen, dass eine Vererbungshierarchie nicht zwangsläufig dynamische Polymorphie erfordert. Deshalb sollte man Basisklassen nicht apriori mit virtuellen Funktionen (z.B. Destruktor) versehen.</p>
<p>C_Cheaf schrieb:</p>
<blockquote>
<p>Wenn man nun zum Beispiel DirectX Programme schreiben will, ist es doch äußerst wichtig nicht unnötig Ressourcen zu verblasen. Eignet sich für zeitkritische Anwendungen objektorientierte Programmierung überhaupt?</p>
</blockquote>
<p>Ja, definitiv. Erstens fallen virtuelle Funktionsaufrufe kaum ins Gewicht, wenn du rechenintensive Vorgänge wie Rendering und die damit verbundene Logik hast. Zweitens musst du dran denken, dass <code>virtual</code> nur eine von vielen Möglichkeiten ist, je nach Situation anderes Programmverhalten zu haben. In C könnte man eine solche Fallunterscheidung über <code>if</code> , <code>switch</code> oder Funktionszeiger lösen, welche aber ebenfalls Performance brauchen.</p>
<p>Abgesehen davon ist Laufzeitpolymorphie nur ein kleiner Teil der objektorientierten Programmierung. OOP als Konzept kann man auch in C realisieren, auch wenn gewisse Möglichkeiten schwieriger oder gar nicht umzusetzen sind. In diesem Zusammenhang ist es auch sinnfrei, OOP generell als &quot;langsam&quot; zu bezeichnen, da man sich damit lediglich auf konkrete Implementierungen des Konzepts bezieht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860027</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860027</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 23 Feb 2010 12:25:43 GMT</pubDate></item><item><title><![CDATA[Reply to Was hat virtual für einen Sinn? on Tue, 23 Feb 2010 12:25:43 GMT]]></title><description><![CDATA[<p>Der Overhead durch den VTable-Lookup ist minimal. Sobald die Funktion wirklich was tut, merkst du rein gar nix mehr.<br />
Bei kleinen Funktionen, die der Compiler ohne virtual Inlinen könnte (tut er auch mit virtual immer noch, wenn es möglich ist) kann der Overhead schon spürbarer werden - aber wirklich nur dann wenn du nur solche Funktionsaufrufe hast.</p>
<p>virtual aber prinzipiell nur dann, wenn nötig. Wenn du erwarten kannst, dass du Runtime-Polymorphie benötigst! Wenn das so ist, bastel dir bitte keine eigene Lösung mit irgend welchen enums und static_casts und sonstwas, weil das am Ende sicherlich langsamer und vor allem deutlich unhandlicher und unübersichtlicher ist, als virtual zu verwenden.</p>
<p>Eine gute Alternative wäre Compiletime-Polymorphie -&gt; templates! Ist aber auch nicht immer möglich und sinnvoll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860028</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860028</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Tue, 23 Feb 2010 12:25:43 GMT</pubDate></item><item><title><![CDATA[Reply to Was hat virtual für einen Sinn? on Tue, 23 Feb 2010 12:55:59 GMT]]></title><description><![CDATA[<p>Ok danke für die ausführlichen Antworten!</p>
<p>Ich habe im Tutorial weitergelesen und bin nun bei virtual und abstrakten Klassen. Eigentlich ganz simpel und einfach DOCH:</p>
<blockquote>
<p>Die Deklaration virtual void header() = 0; bedeutet, dass header eine rein virtuelle (pure virtual) Methode ist. Rein virtuell heißt, dass sie von jeder abgeleiteten Klasse überschrieben werden muss. Es bedeutet aber nicht, dass sie keinen Körper haben kann:</p>
<pre><code>#include&lt;iostream&gt;

    class Base
    {
    public:
      virtual ~Base() {}
      virtual void foo() = 0;
      // = 0 und Methodenkörper können nicht
      //gleichzeitig auftreten, wir müssen foo
      //deshalb gesondert implementieren
    };

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

    void Base::foo()
    {
      cout&lt;&lt;&quot;Base::foo\n&quot;;
    }

    int main()
    {
      Derived d;
      d.foo();
    }
</code></pre>
</blockquote>
<p>Was hat denn das für einen Sinn bitte??? Warum bekommt virtual void foo() nun einen Funktionskörper, auch wenn man von Base gar keine Instanz erstellen kann? Dann kann man diesen Funktionskörper doch nie ausführen?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860048</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860048</guid><dc:creator><![CDATA[C_Cheaf]]></dc:creator><pubDate>Tue, 23 Feb 2010 12:55:59 GMT</pubDate></item><item><title><![CDATA[Reply to Was hat virtual für einen Sinn? on Tue, 23 Feb 2010 13:04:16 GMT]]></title><description><![CDATA[<p>Doch, durch das Base::foo(); kann diese Funktion angesprochen werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860052</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860052</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Tue, 23 Feb 2010 13:04:16 GMT</pubDate></item><item><title><![CDATA[Reply to Was hat virtual für einen Sinn? on Tue, 23 Feb 2010 13:05:49 GMT]]></title><description><![CDATA[<p>Weil das virtual [...] =0 bedeutet, dass die Methode pure virtual ist und von abgeleiteten Klassen implementiert werden MUSS!<br />
Eine Implementierung kann aber durchaus sinn machen, um Codeduplizierung zu sparen. Mir fällt grad kein Beispiel ein, wo das nützlich sein kann, darum einfach ein Std-Testbeispiel:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

struct Base
{
    virtual ~Base() {}
    virtual void foo() const=0;
};

void
Base::foo() const
{
    cout &lt;&lt; &quot;Base::foo&quot; &lt;&lt; endl;
}

struct Derived : public Base
{
    void foo() const {
        cout &lt;&lt; &quot;Derived::foo&quot; &lt;&lt; endl;
        Base::foo();  // rufe Basisimplementierung auf.
    }
};

int main()
{
    Base* b = new Derived;
    b-&gt;foo();
    delete b;
    //b = new Base;  // &lt;-- das geht nicht!
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1860053</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860053</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Tue, 23 Feb 2010 13:05:49 GMT</pubDate></item><item><title><![CDATA[Reply to Was hat virtual für einen Sinn? on Tue, 23 Feb 2010 15:21:54 GMT]]></title><description><![CDATA[<p>Verstehe.</p>
<p>Danke für eure schnellen Antworten!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860128</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860128</guid><dc:creator><![CDATA[C_Cheaf]]></dc:creator><pubDate>Tue, 23 Feb 2010 15:21:54 GMT</pubDate></item><item><title><![CDATA[Reply to Was hat virtual für einen Sinn? on Tue, 23 Feb 2010 16:22:37 GMT]]></title><description><![CDATA[<p>Beißt sich da nicht die Pure Virtual Methode aus Base mit der Implementierung</p>
<pre><code class="language-cpp">struct Base
{
    virtual ~Base() {}
    virtual void foo() const=0; //Pure Virtual
};

void
Base::foo() const   //??? Nun Pure Virtual oder doch implementiert
{
    cout &lt;&lt; &quot;Base::foo&quot; &lt;&lt; endl;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1860159</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860159</guid><dc:creator><![CDATA[GAMES1990]]></dc:creator><pubDate>Tue, 23 Feb 2010 16:22:37 GMT</pubDate></item><item><title><![CDATA[Reply to Was hat virtual für einen Sinn? on Tue, 23 Feb 2010 16:29:54 GMT]]></title><description><![CDATA[<p>Das ist erlaubt. Üblicherweise sieht man sowas aber eher beim Destruktor, wenn überhaupt (sonst könnte man gar keine rein virtuellen Destruktoren einrichten).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860167</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860167</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 23 Feb 2010 16:29:54 GMT</pubDate></item><item><title><![CDATA[Reply to Was hat virtual für einen Sinn? on Tue, 23 Feb 2010 16:39:45 GMT]]></title><description><![CDATA[<p>das es erlaubt ist weiß ich auch aber für den Leser des Codes beißt sich das für mich. Wenn ich eine Pure Virtuel Methode seh denk erwarte ich keine Implementierung.<br />
Mein Post zielte nur auf einen &quot;sauberen&quot; Stil ab</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860178</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860178</guid><dc:creator><![CDATA[GAMES1990]]></dc:creator><pubDate>Tue, 23 Feb 2010 16:39:45 GMT</pubDate></item></channel></rss>