<?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[Rein virtuelle Methoden &#x2F; Abstrakte Klasse]]></title><description><![CDATA[<p>Habe eine spezielle Frage zu rein virtuellen Methoden abstrakter Klassen:</p>
<p>Ist ein Down-Cast von abstrakten Klassen eigentlich noch von Nöten?</p>
<p>kleines Beispiel:</p>
<pre><code class="language-cpp">class Abstrakt                          
{
    protected:
        Abstrakt(){}                    
    public:
        virtual void ausgabe() = 0;
};

class Nichtabstrakt : public Abstrakt
{
    public:
        void ausgabe()
        {
            cout &lt;&lt; &quot;Ich bin nicht&quot;
                 &lt;&lt; &quot;mehr abstrakt&quot;
                 &lt;&lt; endl;
        }
};

main()
{
    Abstrakt* feld[5];                    

    feld[0] = new Nichtabstrakt;
    feld[0]-&gt;ausgabe();          // = ((Nichtabstrakt*)feld[0])-&gt;ausgabe();
                                 // Zufall ??

    getchar();
    return 0;
}
</code></pre>
<p>Ist das nur in meinem Beispiel so, dass beim Aufruf einer Down-geCasteten (abstrakten Klassen)funktion die Funktion diegleiche ist wie ohne Cast?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/216616/rein-virtuelle-methoden-abstrakte-klasse</link><generator>RSS for Node</generator><lastBuildDate>Sun, 11 Oct 2026 07:01:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/216616.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 25 Jun 2008 22:57:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Rein virtuelle Methoden &#x2F; Abstrakte Klasse on Wed, 25 Jun 2008 22:57:37 GMT]]></title><description><![CDATA[<p>Habe eine spezielle Frage zu rein virtuellen Methoden abstrakter Klassen:</p>
<p>Ist ein Down-Cast von abstrakten Klassen eigentlich noch von Nöten?</p>
<p>kleines Beispiel:</p>
<pre><code class="language-cpp">class Abstrakt                          
{
    protected:
        Abstrakt(){}                    
    public:
        virtual void ausgabe() = 0;
};

class Nichtabstrakt : public Abstrakt
{
    public:
        void ausgabe()
        {
            cout &lt;&lt; &quot;Ich bin nicht&quot;
                 &lt;&lt; &quot;mehr abstrakt&quot;
                 &lt;&lt; endl;
        }
};

main()
{
    Abstrakt* feld[5];                    

    feld[0] = new Nichtabstrakt;
    feld[0]-&gt;ausgabe();          // = ((Nichtabstrakt*)feld[0])-&gt;ausgabe();
                                 // Zufall ??

    getchar();
    return 0;
}
</code></pre>
<p>Ist das nur in meinem Beispiel so, dass beim Aufruf einer Down-geCasteten (abstrakten Klassen)funktion die Funktion diegleiche ist wie ohne Cast?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1535957</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1535957</guid><dc:creator><![CDATA[Quellcode]]></dc:creator><pubDate>Wed, 25 Jun 2008 22:57:37 GMT</pubDate></item><item><title><![CDATA[Reply to Rein virtuelle Methoden &#x2F; Abstrakte Klasse on Thu, 26 Jun 2008 02:32:49 GMT]]></title><description><![CDATA[<p>oh, an dem quelltext würden wohl einige leute ziemlich viel auszusetzen haben.</p>
<blockquote>
<p>Ist ein Down-Cast von abstrakten Klassen eigentlich noch von Nöten?</p>
</blockquote>
<p>wenn du ständig downcasten musst, stimmt etwas mit deinem design nicht. virtuelle methoden in basisklassen sind doch genau dafür da, sich das gecaste zu ersparen, weil automatisch die richtige methode aufgerufen wird.<br />
btw. kannst du in deinem beispiel sowohl auf den konstruktor verzichten als auch darauf, ihn protected zu machen, weil du abstrakte klassen sowieso nicht instanziieren kannst.<br />
abgesehen davon verwendest du den gefährlichen (falschen, nie zu verwendenden) C-cast. zum downcasten immer <code>dynamic_cast</code> verwenden (außer du weißt, welchen typ du tatsächlich hast, dann kannst du <code>static_cast</code> verwenden).<br />
und abgesehen davon fehlt dir ein delete <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/1535984</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1535984</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Thu, 26 Jun 2008 02:32:49 GMT</pubDate></item><item><title><![CDATA[Reply to Rein virtuelle Methoden &#x2F; Abstrakte Klasse on Thu, 26 Jun 2008 07:36:46 GMT]]></title><description><![CDATA[<p>queer_boy schrieb:</p>
<blockquote>
<p>oh, an dem quelltext würden wohl einige leute ziemlich viel auszusetzen haben.</p>
</blockquote>
<p>Da hast du vollkommen recht. Alleine schon weil sich der Code auf einen Standardkonformen Compiler nichtmal compilieren liese...</p>
<p>Quellcode schrieb:</p>
<blockquote>
<p>Ist ein Down-Cast von abstrakten Klassen eigentlich noch von Nöten?</p>
</blockquote>
<p>Nur falls du auf etwas zugreifst, das nicht über die entsprechende Basisklasse erreichbar ist. Siehe Kommentar von queer_boy</p>
<p>So nun die wesentlichen anderen Fehler:<br />
a) In eine Basisklasse gehört ein virtueller Destruktor (Der Ausnahmefall ist zu selten, als das ich den hier erwähne).<br />
b) Wenn eine rein virtuelle Methode vorhanden ist, brauchst du mit sicherheit keinen Konstruktor zu definieren, da die Klasse ohnehin nicht instanzierbar ist (Kleiner Trick: Falls man die Basisklasse nicht instanzierbar haben will, aber keinen Kandidat für eine rein virtuelle Methode findet, kann man den Destruktor rein virtuell deklarieren, muss ihn aber dennoch ausdefinieren).<br />
c) Kleiner Vorgriff da man an deinen Code die Befürchtung haben kann das du es machst: Niemals using namespace im Header einsetzten.<br />
d) &quot;main()&quot; gibt es nicht. Wenn dein Compiler das ohne Fehler oder zumindestens einer Warnung durchlässt, würde ich mir dringend einen anderen suchen. Es heist &quot;int main()&quot;.<br />
e) Ich bin kein Freund von Arrays, aber das ist hier unwichtig. Wichtiger ist eigentlich das du ein Array sinnvoll initialisieren würdest, und sei es das jeder eintrag mit 0 initialisiert wird.<br />
f) Wenn du speicher dynamisch allozierst, musst du ihn auch wieder am Schluß freigeben (Zu jedem new gehört ein delete, zu jedem new[] ein delete[]).</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1536048</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1536048</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 26 Jun 2008 07:36:46 GMT</pubDate></item><item><title><![CDATA[Reply to Rein virtuelle Methoden &#x2F; Abstrakte Klasse on Thu, 26 Jun 2008 07:46:00 GMT]]></title><description><![CDATA[<p>Danke für die vielen Hinweise auf meine Fehler in dem Beispiel.</p>
<p>1. ständiges downcasten? die frage war warum die funktion die Gleiche ist<br />
2. wollte ich nur wissen ob man ein Down-Cast bei abstraktne klassen überhaupt<br />
braucht<br />
3. weiß ich, dass ich den Konstruktor nicht brauche, wollte lediglich festlegen,<br />
dass es sich wirklich um eine abstrakte Klasse handelt.<br />
4. weiß ich, wie man sicher downcastet, es ging nur darum zu wissen, warum die<br />
Ausgaben diesselben sind. Sucht sich der Compiler automatisch die passende<br />
Methode?</p>
<p>5. mit dem fehlenden delete hast du vollkommen recht^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1536055</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1536055</guid><dc:creator><![CDATA[Quellcode]]></dc:creator><pubDate>Thu, 26 Jun 2008 07:46:00 GMT</pubDate></item><item><title><![CDATA[Reply to Rein virtuelle Methoden &#x2F; Abstrakte Klasse on Thu, 26 Jun 2008 07:51:20 GMT]]></title><description><![CDATA[<p>Quellcode schrieb:</p>
<blockquote>
<p>die frage war warum die funktion die Gleiche ist [...] Sucht sich der Compiler automatisch die passende Methode?</p>
</blockquote>
<p>Man könnte sagen: Herzlichen Glückwunsch, Du hast den Sinn von virtual demonstriert <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1536058</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1536058</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 26 Jun 2008 07:51:20 GMT</pubDate></item><item><title><![CDATA[Reply to Rein virtuelle Methoden &#x2F; Abstrakte Klasse on Thu, 26 Jun 2008 08:10:34 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Quellcode schrieb:</p>
<blockquote>
<p>die frage war warum die funktion die Gleiche ist [...] Sucht sich der Compiler automatisch die passende Methode?</p>
</blockquote>
<p>Man könnte sagen: Herzlichen Glückwunsch, Du hast den Sinn von virtual demonstriert <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
</blockquote>
<p>Wenn ich dich etwas korrigieren darf?</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/4881">@Quellcode</a>,<br />
Nein der Compiler sucht nicht die richtige Methode. Dies geschieht zur Laufzweit. Da wird automatisch ermittelt, welche Funktion diejenige überschreibt und dann entsprechend aufgerufen. Das ist ja eben auch der Sinn von virtual Methoden.</p>
<p>Und betonen möchte ich virtual Methoden, da virtual auch im Zusammenhang mit Basisklassen auftauchen kann. Aber das hat wiederum mit dem Ableiten von mehreren Klassen zu tun, was besser erst später erwähnt wird <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Im übrigen empfehle ich ein C++ Tutorial oder Buch, wenn dir diese Tatsache mit den virtual Methoden noch nicht bewusst war <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>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1536068</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1536068</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Thu, 26 Jun 2008 08:10:34 GMT</pubDate></item><item><title><![CDATA[Reply to Rein virtuelle Methoden &#x2F; Abstrakte Klasse on Thu, 26 Jun 2008 08:48:57 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>...Nein der Compiler sucht nicht die richtige Methode. Dies geschieht zur Laufzweit. Da wird automatisch ermittelt, ...</p>
</blockquote>
<p>Ich glaube nicht, dass &quot;Quellcode&quot; diese Unterscheidung im Sinn hatte, als er das schrieb ... sondern eher &quot;automatisch&quot; meinte.</p>
<p>Aber gut, dass Du es nun präzisiert hast.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1536105</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1536105</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 26 Jun 2008 08:48:57 GMT</pubDate></item><item><title><![CDATA[Reply to Rein virtuelle Methoden &#x2F; Abstrakte Klasse on Thu, 26 Jun 2008 09:12:45 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>Ich glaube nicht, dass &quot;Quellcode&quot; diese Unterscheidung im Sinn hatte, als er das schrieb ... sondern eher &quot;automatisch&quot; meinte.</p>
</blockquote>
<p>Das Problem ist, man kann dies nicht wissen. Erst recht nicht, wenn er nicht weiss, was virtuelle Methoden sind. Lieber die Sache richtig hinschreiben, als falsch stehen zu lassen. Das verhindert Missverständnisse.</p>
<p>Simon2 schrieb:</p>
<blockquote>
<p>Aber gut, dass Du es nun präzisiert hast.</p>
</blockquote>
<p>Kann es sein, dass dieser Satz ironisch gemeint war? Denn präzisiert ist ja irgendwie übertrieben. Ich habe nur das Compiler durch Laufzeit ersetzt. Mit virtuellen Tabellen und Zeigern wollte ich jetzt nicht kommen, das wäre wohl zu viel gewesen <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>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1536128</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1536128</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Thu, 26 Jun 2008 09:12:45 GMT</pubDate></item><item><title><![CDATA[Reply to Rein virtuelle Methoden &#x2F; Abstrakte Klasse on Thu, 26 Jun 2008 17:32:23 GMT]]></title><description><![CDATA[<p>Ja, danke für die Hilfen.<br />
bin grade erst dabei, das Ganze ein bisschen zu verstehen.<br />
Ich habe bereits &quot;gewusst&quot;, dass der die Methode zur Laufzeit ausgewählt wird,<br />
nur nicht so ganz verstanden und es mir quasi damit selbst erklärt, jetzt weiß ich mehr^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1536549</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1536549</guid><dc:creator><![CDATA[Quellcode]]></dc:creator><pubDate>Thu, 26 Jun 2008 17:32:23 GMT</pubDate></item><item><title><![CDATA[Reply to Rein virtuelle Methoden &#x2F; Abstrakte Klasse on Fri, 27 Jun 2008 07:04:12 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>...</p>
<p>Simon2 schrieb:</p>
<blockquote>
<p>Aber gut, dass Du es nun präzisiert hast.</p>
</blockquote>
<p>Kann es sein, dass dieser Satz ironisch gemeint war? ...</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
Nein, das war nicht ironisch gemeint - so wie das hier auch nicht.</p>
<p>Ich hatte das schon richtig verstanden und meinte den Dank für die &quot;Präzisierung&quot; ernst.</p>
<p>Gruß,</p>
<p>Simon2.</p>
<p>P.S.: Da es letztlich (und im Internet erst Recht) unmöglich ist, &quot;Nicht-Ironie&quot; zu beweisen, wirst du mir letztlich glauben müssen....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1536739</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1536739</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Fri, 27 Jun 2008 07:04:12 GMT</pubDate></item><item><title><![CDATA[Reply to Rein virtuelle Methoden &#x2F; Abstrakte Klasse on Fri, 27 Jun 2008 09:39:10 GMT]]></title><description><![CDATA[<p>Ich habe btw. auch ein Buch hier, in dem steht, dass der Compiler das machen würde .. dieser Fehler scheint also etwas verbreiteter zu sein. In einem Anderen wird auf die vtables verwiesen und klar gemacht, dass solche Vererbungen ineffizient sind und man es deshalb bei Anwendungen, bei denen es um jeden Frame geht, nicht mit der Vererbung übertreiben soll, was dann wohl eher richtig ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1536850</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1536850</guid><dc:creator><![CDATA[dust]]></dc:creator><pubDate>Fri, 27 Jun 2008 09:39:10 GMT</pubDate></item><item><title><![CDATA[Reply to Rein virtuelle Methoden &#x2F; Abstrakte Klasse on Fri, 27 Jun 2008 11:40:58 GMT]]></title><description><![CDATA[<p>sorry, aber vererben und ineffizient sein passt so nicht einfach zusammen.<br />
entweder du hast nicht richtig paraphrasiert oder das buch ist ebenfalls nicht eines der besten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1536942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1536942</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Fri, 27 Jun 2008 11:40:58 GMT</pubDate></item><item><title><![CDATA[Reply to Rein virtuelle Methoden &#x2F; Abstrakte Klasse on Fri, 27 Jun 2008 18:12:08 GMT]]></title><description><![CDATA[<p>ich kann mir nicht vorstellen, das vererben ineffizient sei...<br />
Wenn ich mir da die Klassenhierarchie der VCl anschaue...<br />
da gibts etliche Ableitungen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1537135</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1537135</guid><dc:creator><![CDATA[Quellcode]]></dc:creator><pubDate>Fri, 27 Jun 2008 18:12:08 GMT</pubDate></item><item><title><![CDATA[Reply to Rein virtuelle Methoden &#x2F; Abstrakte Klasse on Fri, 27 Jun 2008 20:28:12 GMT]]></title><description><![CDATA[<p>die ableitungen sind auch kein problem. (wenn man es mit der tiefe nicht zu sehr übertreibt und so den ctor dank aufruf aller eltern-ctors drastisch aufbläht. aber selbst das spielt bei einem halbwegs sauberen design keine überwältigende rolle, da objekte deutlich länger zur verarbeitung denn zur erzeugung brauchen sollten.)<br />
die virtual-funktionen sind langsamer im aufruf als nicht virtual, da immer erst in der vtable geschaut werden muss, wo die funktion ist, was aber kaum eine rolle spielt, da auch hier gilt: wenn die funktion nicht trivial ist, liegt die ausführzeit deutlich über der aufrufzeit.</p>
<p>was schon eher ein problem sein kann, ist, dass die virtual-funktionen auf manchen prozessoren das cache-handling und die branch-prediction zerpflücken können (wobei die prozessoren in dem bereich deutlich besser geworden sind als früher). das ist tatsächlich lässtig. aber hier gilt: erst schauen, ob das wirklich passiert und dann überlegen, wie, oder in vielen fällen wohl eher, ob man das umgehen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1537211</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1537211</guid><dc:creator><![CDATA[ghorst]]></dc:creator><pubDate>Fri, 27 Jun 2008 20:28:12 GMT</pubDate></item><item><title><![CDATA[Reply to Rein virtuelle Methoden &#x2F; Abstrakte Klasse on Fri, 27 Jun 2008 22:42:36 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
Nein, das war nicht ironisch gemeint - so wie das hier auch nicht.</p>
<p>...</p>
<p>P.S.: Da es letztlich (und im Internet erst Recht) unmöglich ist, &quot;Nicht-Ironie&quot; zu beweisen, wirst du mir letztlich glauben müssen....</p>
</blockquote>
<p>Ich bin dann wohl ein wenig paranoid <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="🙂"
    /><br />
Naja. Ich fand es halt einfach irgendwie witzig, weil so viel präziser war es ja eben nicht. Aber egal.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1537259</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1537259</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 27 Jun 2008 22:42:36 GMT</pubDate></item></channel></rss>