<?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[virtueller destruktor]]></title><description><![CDATA[<p>hi</p>
<p>man soll ja nur von klassen erben die einen virtuellen dtor haben. wenn ich nun in base selber keinen dtor deklariere, wird der compiler mir einen virtuellen hinzufügen?</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/289206/virtueller-destruktor</link><generator>RSS for Node</generator><lastBuildDate>Wed, 19 Aug 2026 07:35:04 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/289206.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 30 Jun 2011 10:31:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to virtueller destruktor on Thu, 30 Jun 2011 10:31:31 GMT]]></title><description><![CDATA[<p>hi</p>
<p>man soll ja nur von klassen erben die einen virtuellen dtor haben. wenn ich nun in base selber keinen dtor deklariere, wird der compiler mir einen virtuellen hinzufügen?</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2086506</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2086506</guid><dc:creator><![CDATA[lol_of_lolcraft]]></dc:creator><pubDate>Thu, 30 Jun 2011 10:31:31 GMT</pubDate></item><item><title><![CDATA[Reply to virtueller destruktor on Thu, 30 Jun 2011 10:38:57 GMT]]></title><description><![CDATA[<p>ja. Die Basisklasse braucht erst dann einen virtuellen Dtor wenn du ein Objekt von abgeleitetem Typ über einen Basisklassenzeiger deleten willst. Aber die Faustregel mit virtueller Dtor sobald es eine virtuelle Methode gibt ist schon ganz brauchbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2086507</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2086507</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Thu, 30 Jun 2011 10:38:57 GMT</pubDate></item><item><title><![CDATA[Reply to virtueller destruktor on Thu, 30 Jun 2011 10:44:46 GMT]]></title><description><![CDATA[<p>lol_of_lolcraft schrieb:</p>
<blockquote>
<p>man soll ja nur von klassen erben die einen virtuellen dtor haben.</p>
</blockquote>
<p>Ist nur die halbe Wahrheit. Virtueller Destruktor, wenn du über einen Basisklassenzeiger zerstören willst. Sonst protected und nichtvirtuell, wenn die Klasse ausschließlich als Basisklasse verwendet werden soll.</p>
<blockquote>
<p>wenn ich nun in base selber keinen dtor deklariere, wird der compiler mir einen virtuellen hinzufügen?</p>
</blockquote>
<p>Nein. Der Compiler macht nichts von selbst virtuell, was nicht schon vorher (d.h. in einer Elternklasse) virtuell war.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2086522</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2086522</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 30 Jun 2011 10:44:46 GMT</pubDate></item><item><title><![CDATA[Reply to virtueller destruktor on Thu, 30 Jun 2011 10:50:32 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<blockquote>
<p>wenn ich nun in base selber keinen dtor deklariere, wird der compiler mir einen virtuellen hinzufügen?</p>
</blockquote>
<p>Nein. Der Compiler macht nichts von selbst virtuell, was nicht schon vorher (d.h. in einer Elternklasse) virtuell war.</p>
</blockquote>
<p>Stimmt, sry, nicht genau genug gelesen. Wenn die Basis einen virtuellen Dtor hat dann mach der Compiler auch für jede abgeleitete Klasse autom. einen virtuellen Dtor. Aber wenn die Basis nicht explizit einen virtuellen Dtor deklariert dann hat sie auch keinen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2086526</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2086526</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Thu, 30 Jun 2011 10:50:32 GMT</pubDate></item><item><title><![CDATA[Reply to virtueller destruktor on Thu, 30 Jun 2011 12:12:43 GMT]]></title><description><![CDATA[<p>lol_of_lolcraft schrieb:</p>
<blockquote>
<p>man soll ja nur von klassen erben die einen virtuellen dtor haben.</p>
</blockquote>
<p>Das stimmt so nicht. Aber man soll nur Klassen polymorph verwenden, die einen virtuellen Destruktor haben.</p>
<p>Vererbung impliziert keine Polymorphie.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2086570</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2086570</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 30 Jun 2011 12:12:43 GMT</pubDate></item><item><title><![CDATA[Reply to virtueller destruktor on Thu, 30 Jun 2011 12:59:19 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>lol_of_lolcraft schrieb:</p>
<blockquote>
<p>man soll ja nur von klassen erben die einen virtuellen dtor haben.</p>
</blockquote>
<p>Das stimmt so nicht. Aber man soll nur Klassen polymorph verwenden, die einen virtuellen Destruktor haben.</p>
</blockquote>
<p>Naja, das stimmt so auch nicht.</p>
<p>Es geht einfach nur darum ob Objekte jemals über einen Basisklassenzeiger gelöscht werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2086613</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2086613</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 30 Jun 2011 12:59:19 GMT</pubDate></item><item><title><![CDATA[Reply to virtueller destruktor on Thu, 30 Jun 2011 13:06:03 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Nexus schrieb:</p>
<blockquote>
<p>lol_of_lolcraft schrieb:</p>
<blockquote>
<p>man soll ja nur von klassen erben die einen virtuellen dtor haben.</p>
</blockquote>
<p>Das stimmt so nicht. Aber man soll nur Klassen polymorph verwenden, die einen virtuellen Destruktor haben.</p>
</blockquote>
<p>Naja, das stimmt so auch nicht.</p>
<p>Es geht einfach nur darum ob Objekte jemals über einen Basisklassenzeiger gelöscht werden.</p>
</blockquote>
<p>Richtig. Es gibt (wenige) Situationen, wo man beim Erzeugen/Zerstören sehr genau weiß, mit welcher konkreten Klasse man es zu tun hat (d.h. kein virtueller Dtor nötig), wo aber Referenzen auf die Basisklasse durchs Programm geworfen werden inclusive Aufrufen von virtuellen Methoden. Einige Compiler meckern dann fleißig wenn der Dtor nicht virtuell ist <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":/"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2086621</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2086621</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 30 Jun 2011 13:06:03 GMT</pubDate></item><item><title><![CDATA[Reply to virtueller destruktor on Thu, 30 Jun 2011 13:16:58 GMT]]></title><description><![CDATA[<p>hustbaer, ich habe mir vorher ernsthaft überlegt, das auch noch zu schreiben, fand es dann aber zu unwichtig.</p>
<p>Meine Überlegung: Grundsätzlich treffe ich beim Design einer Klasse die Entscheidung, ob sie polymorph ist, also virtuelle Funktionen anbietet oder nicht. Sobald einige Funktionen virtuell sind, kann ich den Destruktor auch gleich virtuell machen, da</p>
<ol>
<li>der Benutzer im Allgemeinen davon ausgeht, dass man polymorphe Klassen auch polymorph zerstören kann</li>
<li>der Overhead der VTable ohnehin schon da ist.</li>
</ol>
<p>Bei Vererbung hingegen ist es ein viel grösserer Schritt bis zur polymorphen Zerstörung, daher halte ich es für sinnvoll, hier die Grenze zu ziehen. Aber es gibt natürlich Situationen, wo man den virtuellen Destruktor nicht zwingend braucht (z.B. auch bei <code>shared_ptr</code> ).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2086634</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2086634</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 30 Jun 2011 13:16:58 GMT</pubDate></item><item><title><![CDATA[Reply to virtueller destruktor on Thu, 30 Jun 2011 13:24:52 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<ol>
<li>der Benutzer im Allgemeinen davon ausgeht, dass man polymorphe Klassen auch polymorph zerstören kann</li>
</ol>
</blockquote>
<p>Sehe ich anders. Vor allem wenns um Factories geht, wo im sauberen Fall die Objekte dort zerstört werden, wo sie erzeugt werden, nämlich in der factory.</p>
<blockquote>
<ol>
<li>der Overhead der VTable ohnehin schon da ist.</li>
</ol>
</blockquote>
<p>Die vtable ist eine Speicher-Angelegenheit. Der Aufruf von virtuellen Funktionen über die vtable eine Performance-Angelegenheit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2086641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2086641</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 30 Jun 2011 13:24:52 GMT</pubDate></item><item><title><![CDATA[Reply to virtueller destruktor on Thu, 30 Jun 2011 13:40:26 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Sehe ich anders. Vor allem wenns um Factories geht, wo im sauberen Fall die Objekte dort zerstört werden, wo sie erzeugt werden, nämlich in der factory.</p>
</blockquote>
<p>Ich schreibe ja &quot;im Allgemeinen&quot;. Dabei denke ich zunächst an Klassen, die vom Benutzer selbst erzeugt und zerstört werden. Bei Factories ist der Destruktor je nachdem gar nicht öffentlich...</p>
<p>Abgesehen davon finde ich es generell sauberer, wenn das Objekt nicht explizit gelöscht werden muss, z.B. indem es in einem Smart-Pointer gespeichert wird. Im konkreten Fall hängt es halt von den genauen Anforderungen (Besitzsemantik, Performance etc.) ab, was man nimmt.</p>
<p>pumuckl schrieb:</p>
<blockquote>
<p>Die vtable ist eine Speicher-Angelegenheit. Der Aufruf von virtuellen Funktionen über die vtable eine Performance-Angelegenheit.</p>
</blockquote>
<p>Gut, aber was hat das mit meiner Aussage zu tun? Ich meinte damit nur, dass ich durch die Regel &quot;alle Basisklassen müssen virtuelle Destruktoren haben&quot; unnötig VTable-Overhead erzeuge, während die Nachteile bei &quot;alle polymorphen Klassen müssen virtuelle Destruktoren haben&quot; 1. weniger dramatisch ausfallen und 2. durch die höhere Wahrscheinlichkeit, dass der Destruktor polymorph aufgerufen wird, eher gerechtfertigt sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2086649</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2086649</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 30 Jun 2011 13:40:26 GMT</pubDate></item><item><title><![CDATA[Reply to virtueller destruktor on Thu, 30 Jun 2011 13:51:48 GMT]]></title><description><![CDATA[<p>Sobald eine Methode virtuell ist, ist sie zum Ableiten gedacht und dann mache ich automatisch den Dtor virtuell. Fertig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2086658</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2086658</guid><dc:creator><![CDATA[this-*gt*that]]></dc:creator><pubDate>Thu, 30 Jun 2011 13:51:48 GMT</pubDate></item><item><title><![CDATA[Reply to virtueller destruktor on Thu, 30 Jun 2011 14:14:28 GMT]]></title><description><![CDATA[<p>Ja das ist eine gängige Faustregel. Aber wie schon gesagt wurde ist ein virtueller Destruktor nicht immer notwendig, auch wenn die Klasse eine Basis ist und virtuelle Methoden hat. Ein virtueller Destruktor ist <em>nur</em> dann notwendig wenn über einen Basisklassenzeiger deleted werden soll. Aber zumindest besser als andere Faustregeln wo z.B. propagiert wird dass jede Klasse immer einen virtuellen Dtor braucht (meist mit der Begründung dass ja irgendwer irgendwann davon ableiten könnte), was natürlich vollkommener Schwachsinn ist und viel Schaden anrichten kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2086669</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2086669</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Thu, 30 Jun 2011 14:14:28 GMT</pubDate></item><item><title><![CDATA[Reply to virtueller destruktor on Thu, 30 Jun 2011 14:40:59 GMT]]></title><description><![CDATA[<p>Woher sollte ich denn wissen, dass die Instanzen von abgeleiteten Klassen absolut niemals ueber Basisklassenzeiger geloescht werden?</p>
<p>Das kann ich als Erzeuger der Basisklasse doch meistens garnicht wissen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2086697</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2086697</guid><dc:creator><![CDATA[this-*gt*that]]></dc:creator><pubDate>Thu, 30 Jun 2011 14:40:59 GMT</pubDate></item><item><title><![CDATA[Reply to virtueller destruktor on Thu, 30 Jun 2011 14:54:26 GMT]]></title><description><![CDATA[<p>this-&gt;that schrieb:</p>
<blockquote>
<p>Das kann ich als Erzeuger der Basisklasse doch meistens garnicht wissen.</p>
</blockquote>
<p>Doch. Wenn du eine Basisklasse schreibst dann weißt du doch für was die gedacht ist, immerhin bist du dort auf der selben Abstraktionsschicht wie der Code der sie verwendet (wenn nicht dann verwendest du Vererbung grad falsch). Und in den entsprechenden Fällen wirst du den Destruktor protected machen, damit ist es unmöglich solche Objekte über einen Basisklassenzeiger zu deleten...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2086702</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2086702</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Thu, 30 Jun 2011 14:54:26 GMT</pubDate></item><item><title><![CDATA[Reply to virtueller destruktor on Thu, 30 Jun 2011 14:59:15 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<p>this-&gt;that schrieb:</p>
<blockquote>
<p>Das kann ich als Erzeuger der Basisklasse doch meistens garnicht wissen.</p>
</blockquote>
<p>Doch. Wenn du eine Basisklasse schreibst dann weißt du doch für was die gedacht ist</p>
</blockquote>
<p>Ja. Zum vererben. <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>dot schrieb:</p>
<blockquote>
<p>immerhin bist du dort auf der selben Abstraktionsschicht wie der Code der sie verwendet (wenn nicht dann verwendest du Vererbung grad falsch). Und in den entsprechenden Fällen wirst du den Destruktor protected machen, damit ist es unmöglich Objekte über einen Basisklassenzeiger zu deleten...</p>
</blockquote>
<p>Habe ich in der Praxis noch nicht ein einziges mal gesehen. In 99% der Faelle schreibst du virtual, weil das Ding ne Basisklasse wird und andere davon ableiten sollen und es nahezu immer Sinn macht, die Moeglichkeit einzuraeumen ueber Basisklassenzeiger zu loeschen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2086706</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2086706</guid><dc:creator><![CDATA[this-*gt*that]]></dc:creator><pubDate>Thu, 30 Jun 2011 14:59:15 GMT</pubDate></item><item><title><![CDATA[Reply to virtueller destruktor on Thu, 30 Jun 2011 15:09:16 GMT]]></title><description><![CDATA[<p>this-&gt;that schrieb:</p>
<blockquote>
<p>dot schrieb:</p>
<blockquote>
<p>this-&gt;that schrieb:</p>
<blockquote>
<p>Das kann ich als Erzeuger der Basisklasse doch meistens garnicht wissen.</p>
</blockquote>
<p>Doch. Wenn du eine Basisklasse schreibst dann weißt du doch für was die gedacht ist</p>
</blockquote>
<p>Ja. Zum vererben. <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>Nur ein verschwindend geringer (man könnte fast sagen vernachlässigbarer) Teil meiner &quot;Basisklassen&quot; dient wirklich als Basisklasse in dem Sinne dass andere Klassen etwas davon erben (ich bin mit solche Klassen bewusst sehr sparsam). Der Großteil sind einfach nur rein abstrakte Interfaces. Der Code der diese Interfaces verwendet ist vollkommen losgelöst vom Code der die Objekte erzeugt die diese Interfaces implementieren. Der Code der die Objekte erzeugt kennt die aber meistens direkt und nicht nur über ihr Interface. Die Möglichkeit Objekte über Basisklassenzeiger zu deleten braucht man gar nicht so oft wie du vielleicht denkst und wenn dann beschränkt sich das auch auf kleine Bereiche des Codes.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2086707</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2086707</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Thu, 30 Jun 2011 15:09:16 GMT</pubDate></item><item><title><![CDATA[Reply to virtueller destruktor on Thu, 30 Jun 2011 15:11:55 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<p>ein virtueller Destruktor nicht immer notwendig, auch wenn die Klasse eine Basis ist und virtuelle Methoden hat. Ein virtueller Destruktor ist <em>nur</em> dann notwendig wenn über einen Basisklassenzeiger deleted werden soll.</p>
</blockquote>
<p>Ich verstehe nicht, wozu die Basis virtuelle Funktionen hat, wenn Sie sowie nicht über einen Basiszeiger angesprochen werden kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2086710</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2086710</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Thu, 30 Jun 2011 15:11:55 GMT</pubDate></item><item><title><![CDATA[Reply to virtueller destruktor on Thu, 30 Jun 2011 15:12:47 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<p>this-&gt;that schrieb:</p>
<blockquote>
<p>dot schrieb:</p>
<blockquote>
<p>this-&gt;that schrieb:</p>
<blockquote>
<p>Das kann ich als Erzeuger der Basisklasse doch meistens garnicht wissen.</p>
</blockquote>
<p>Doch. Wenn du eine Basisklasse schreibst dann weißt du doch für was die gedacht ist</p>
</blockquote>
<p>Ja. Zum vererben. <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>Nur ein verschwindend geringer (man könnte fast sagen vernachlässigbarer) Teil meiner &quot;Basisklassen&quot; dient wirklich als Basisklasse in dem Sinne dass andere Klassen etwas davon erben (ich bin mit solche Klassen bewusst sehr sparsam). Der Großteil sind einfach nur rein abstrakte Interfaces. Der Code der diese Interfaces verwendet ist vollkommen losgelöst vom Code der die Objekte erzeugt die diese Interfaces implementieren. Der Code der die Objekte erzeugt kennt die aber meistens direkt und nicht nur über ihr Interface. Die Möglichkeit Objekte über Basisklassenzeiger zu deleten braucht man gar nicht so oft wie du vielleicht denkst und wenn dann beschränkt sich das auch auf kleine Bereiche des Codes.</p>
</blockquote>
<p>Naja, letztlich braucht man es nur dann nicht, wenn die Erzeugung und Zerstoerung zentralisiert (z.B. ueber eine Factory) stattfindet.</p>
<p>Es ist auf jeden Fall nicht der Standardfall, denn das ist ja gerade einer DER Pluspunkte von Vererbung, dass du gegen ein Interface programmierst und nicht wissen musst wie die Implementierung aussieht und auch das Loeschen automatisch klappt.</p>
<p>Ich bleibe auf jeden Fall bei meiner Faustregel=)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2086712</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2086712</guid><dc:creator><![CDATA[this-*gt*that]]></dc:creator><pubDate>Thu, 30 Jun 2011 15:12:47 GMT</pubDate></item><item><title><![CDATA[Reply to virtueller destruktor on Thu, 30 Jun 2011 15:13:11 GMT]]></title><description><![CDATA[<p>Jockelx schrieb:</p>
<blockquote>
<p>Ich verstehe nicht, wozu die Basis virtuelle Funktionen hat, wenn Sie sowie nicht über einen Basiszeiger angesprochen werden kann.</p>
</blockquote>
<p>&quot;Ansprechen&quot; ist was andres als das Objekt deleten...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2086713</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2086713</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Thu, 30 Jun 2011 15:13:11 GMT</pubDate></item><item><title><![CDATA[Reply to virtueller destruktor on Thu, 30 Jun 2011 15:30:53 GMT]]></title><description><![CDATA[<p>this-&gt;that schrieb:</p>
<blockquote>
<p>Es ist auf jeden Fall nicht der Standardfall, denn das ist ja gerade einer DER Pluspunkte von Vererbung, dass du gegen ein Interface programmierst und nicht wissen musst wie die Implementierung aussieht [...]</p>
</blockquote>
<p>Naürlich. Aber wie gesagt: Der Code der das abstrakte Interface <em>verwendet</em> ist normalerweise losgelöst vom Code der die Objekte <em>erzeugt</em> und zerstört.</p>
<p>this-&gt;that schrieb:</p>
<blockquote>
<p>Naja, letztlich braucht man es nur dann nicht, wenn die Erzeugung und Zerstoerung zentralisiert (z.B. ueber eine Factory) stattfindet.</p>
</blockquote>
<p>Beispiel:</p>
<p>Ich hab mein 3D Spiel und da hab ich eine Klasse <code>Scene</code> die eben meine 3D Szene darstellt. Und in diese Szene kann ich jetzt <code>SceneObject</code> s (ein Interface) einfügen. Nun erzeugt meine Spiellogik Objekte die auch eine graphische Repräsentation haben sollen. Diese Objekte erzeugen (oder bekommen) ihrerseits die entsprechenden Grafikobjekte die alle <code>SceneObject</code> s sind und dann in die <code>Scene</code> eingefügt werden. Aber meine Klasse <code>Player</code> weiß dass sie ein <code>AnimatedModel</code> hat und kennt dieses nicht nur als <code>SceneObject</code> . Anders gehts sogar garnicht da die <code>Player</code> Klasse ja die Animationen abspielen muss und dafür reicht ein allgemeines <code>SceneObject</code> nicht. Wer auch immer das <code>AnimatedModel</code> erstellt zerstört es auch wieder und tut dies über den konkreten Typ und nicht über das Interface. Wenn man mit Dependency Injection arbeitet ergeben sich meiner Erfahrung nach eigentlich immer solche Strukturen. Das hat nichts mit zentralen Factories zu tun sondern einzig mit der Tatsache dass man den konkreten Typ kennen muss um ein Objekt zu erzeugen. Natürlich gibt es auch Fälle wo man über Basiszeiger deleten will, aber die sind meiner Erfahrung nach bei weitem nicht so häufig wie man vielleicht denken mag.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2086715</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2086715</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Thu, 30 Jun 2011 15:30:53 GMT</pubDate></item><item><title><![CDATA[Reply to virtueller destruktor on Thu, 30 Jun 2011 15:32:04 GMT]]></title><description><![CDATA[<p>Hilft mir ehrlich gesagt nicht:</p>
<p>SceneObject ist jetzt die Basisklasse mit virtuellen Funktionen und protected Destruktor?<br />
Und AnimatedModel ist eine Ableitung davon?<br />
Und was ist jetzt der Vorteil davon (statt 'normalem' virtuellen Destruktor)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2086723</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2086723</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Thu, 30 Jun 2011 15:32:04 GMT</pubDate></item><item><title><![CDATA[Reply to virtueller destruktor on Thu, 30 Jun 2011 15:37:16 GMT]]></title><description><![CDATA[<p>Jockelx schrieb:</p>
<blockquote>
<p>SceneObject ist jetzt die Basisklasse mit virtuellen Funktionen und protected Destruktor?</p>
</blockquote>
<p>ja z.B.</p>
<p>Jockelx schrieb:</p>
<blockquote>
<p>Und AnimatedModel ist eine Ableitung davon?</p>
</blockquote>
<p>ja</p>
<p>Jockelx schrieb:</p>
<blockquote>
<p>Und was ist jetzt der Vorteil davon (statt 'normalem' virtuellen Destruktor)?</p>
</blockquote>
<p>Es geht nicht um irgendeinen Vorteil sondern darum zu demonstrieren dass hier nirgendwo über Basiszeiger deleted werden muss. Der der das Objekt erzeugt hat zerstört es auch wieder und er kennt das Objekt beim konkreten Typ und nicht nur über den Basiszeiger. Und das Beispiel ist jetzt nicht gerade an den Haaren herbeigezogen, sowas hat man eigentlich ziemlich oft. <em>Gerade</em> eine Factory ist eigentlich die einzige Möglichkeit Objekte zu erzeugen ohne ihren konkreten Typ zu kennen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2086726</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2086726</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Thu, 30 Jun 2011 15:37:16 GMT</pubDate></item><item><title><![CDATA[Reply to virtueller destruktor on Thu, 30 Jun 2011 15:38:22 GMT]]></title><description><![CDATA[<p>Mmh? Das ist doch gar nicht die Frage, dass man nicht <strong>immer</strong> über den Basiszeiger deleten muss.<br />
Das Problem ist doch, dass man deine SceneObjects <strong>nie</strong> über den Basiszeiger deleten kann.</p>
<p>Und da frage ich mich: wo brauch man das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2086727</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2086727</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Thu, 30 Jun 2011 15:38:22 GMT</pubDate></item><item><title><![CDATA[Reply to virtueller destruktor on Thu, 30 Jun 2011 15:57:45 GMT]]></title><description><![CDATA[<p>Jockelx schrieb:</p>
<blockquote>
<p>Das Problem ist doch, dass man deine SceneObjects <strong>nie</strong> über den Basiszeiger deleten kann.</p>
</blockquote>
<p>Du siehst es falsch rum. Es macht keinen Sinn ein SceneObject über den Basiszeiger zu deleten und <em>soll</em> daher auch nicht möglich sein. Das Interface dient nur dazu verwendet zu werden. Die Verwaltung der konkreten Objekte passiert wo anders. Code der mit SceneObject arbeitet soll sich nicht darum kümmern was für konkrete Objekte dahinterstehen und wie sie erzeugt wurden. Dafür sind andere zuständig. Überleg mal was es genau bedeutet wenn du Code hast der ein Objekt über einen Basisklassenzeiger deleted. Damit sagst du: &quot;Ich weiß zwar nicht was für ein Objekt das genau ist aber es <em>muss</em> mit new erzeugt worden sein&quot;...<br />
Wenn ich sowas mach dann will ich sichergestellt haben dass solche Objekte nur mit new erzeugt werden können. In dem Fall verwend ich normalerweise folgendes Pattern:</p>
<pre><code class="language-cpp">class MyObject
{
protected:
  MyObject() {}
  ~MyObject() {}

public:

  virtual void DoSomething() = 0;

  virtual void Release() = 0;

}

class MyConcreteObjectA : public MyObject
{
private:
  MyConcreteObjectA() {}
  ~MyConcreteObjectA() {}

public:

  static MyConcreteObjectA* create() { return new MyConcreteObjectA(); }

  void DoSomething() { ... }

  void Release() { delete this; }

}
</code></pre>
<p>Und da brauch ich <em>erst recht</em> keinen virtuellen Destruktor <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/2086729</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2086729</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Thu, 30 Jun 2011 15:57:45 GMT</pubDate></item><item><title><![CDATA[Reply to virtueller destruktor on Thu, 30 Jun 2011 16:03:07 GMT]]></title><description><![CDATA[<p>Nee, das legst du mir jetzt aber in den Mund, dass ich deine Interface-Struktur aufbrechen will.<br />
Aber okay, so langsam verstehe ich dein Beispiel.<br />
Du verhinderst mit deinem Design, dass man deine Interface-Struktur überhaupt aufbrechen <strong>kann</strong>.<br />
Okay, das ist vielleicht ganz gut. Andererseits darf so jemand auch gerne damit auf die Fresse fallen, wenn er fröhlich Pointer deleted, die er über eine Interface-Funktion kriegt.</p>
<p>Dankeschön, war ganz interessant. Auch wenn du mich nicht überzeugen konntest, das zukünftig so zu machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2086734</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2086734</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Thu, 30 Jun 2011 16:03:07 GMT</pubDate></item></channel></rss>