<?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[Konstruktor von virtueller Klasse]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe folgende Klasse:</p>
<pre><code class="language-cpp">class Klasse1
{
  private:
    Klasse2* k;

  public:
    Klasse1();
    virtual ~Klasse1();
    virtual void methode() = 0;
}
</code></pre>
<p>und</p>
<pre><code class="language-cpp">Klasse1::Klasse1()
{
  k = new Klasse2();
}
</code></pre>
<p>Natürlich habe ich noch konkrete Klassen, die von Klasse1 erben. Der GCC kompiliert das auch. Nun allokiere ich in meinem Konstruktor aber dynamisch Speicher, den ich mangels konkretem Destruktor natürlich nicht wieder los werde. Auf den virtuellen Destruktor kann ich aber natürlich auch nicht verzichten.</p>
<p>Mich beschleicht ja das Gefühl, dass das Konzept suboptimal ist. <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>Wie löst man das?</p>
<p>Vielen Dank.</p>
<p>EDIT: Beispiel korrigiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/271072/konstruktor-von-virtueller-klasse</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 17:04:26 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/271072.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 22 Jul 2010 20:36:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Konstruktor von virtueller Klasse on Thu, 22 Jul 2010 20:57:09 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe folgende Klasse:</p>
<pre><code class="language-cpp">class Klasse1
{
  private:
    Klasse2* k;

  public:
    Klasse1();
    virtual ~Klasse1();
    virtual void methode() = 0;
}
</code></pre>
<p>und</p>
<pre><code class="language-cpp">Klasse1::Klasse1()
{
  k = new Klasse2();
}
</code></pre>
<p>Natürlich habe ich noch konkrete Klassen, die von Klasse1 erben. Der GCC kompiliert das auch. Nun allokiere ich in meinem Konstruktor aber dynamisch Speicher, den ich mangels konkretem Destruktor natürlich nicht wieder los werde. Auf den virtuellen Destruktor kann ich aber natürlich auch nicht verzichten.</p>
<p>Mich beschleicht ja das Gefühl, dass das Konzept suboptimal ist. <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>Wie löst man das?</p>
<p>Vielen Dank.</p>
<p>EDIT: Beispiel korrigiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1930285</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1930285</guid><dc:creator><![CDATA[matthias00]]></dc:creator><pubDate>Thu, 22 Jul 2010 20:57:09 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor von virtueller Klasse on Thu, 22 Jul 2010 20:39:26 GMT]]></title><description><![CDATA[<p>Wo ist überhaupt das Problem? Gib den Speicher im Destruktor wieder frei. Der Destruktor einer abgeleiteten Klasse ruft auch die destruktoren der basisklasse auf. Das virtual sorgt nur dafür, dass überhaupt der Destruktor der abgeleiteten Klasse aufgerufen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1930290</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1930290</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 22 Jul 2010 20:39:26 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor von virtueller Klasse on Thu, 22 Jul 2010 20:40:31 GMT]]></title><description><![CDATA[<p>Dann implementier den Destruktor halt. Du kannst eine Funktion (auch den Destruktor) dennoch virtuell machen, auch wenn er einen Funktionskörper hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1930291</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1930291</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 22 Jul 2010 20:40:31 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor von virtueller Klasse on Thu, 22 Jul 2010 20:46:16 GMT]]></title><description><![CDATA[<blockquote>
<p>Nun allokiere ich in meinem Konstruktor aber dynamisch Speicher</p>
</blockquote>
<p>Nein, du allokierst im Konstruktor keinen dynamischen Speicher, sondern weist deinem Member (Pointer) einen Wert zu. Die Allokation hat bereits vor dem Konstruktor stattgefunden. Der der den Speicher da allokiert hat, ist auch fürs Zerstören verantwortlich.</p>
<blockquote>
<p>, den ich mangels konkretem Destruktor natürlich nicht wieder los werde. Auf den virtuellen Destruktor kann ich aber natürlich auch nicht verzichten.</p>
</blockquote>
<p>Das versteh ich nicht. Sobald ein Destruktor als virtual deklariert ist, ist er auch in abgeleiteten Klassen virtuell. Wenn du dort keinen Destruktor deklarierst, brauchst du wohl auch keinen. Wenn alle Klassen einen Destruktor implementieren, die einen brauchen, hast du eigentlich gar keine Probleme mit Memory Leaks usw...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1930293</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1930293</guid><dc:creator><![CDATA[sodomist]]></dc:creator><pubDate>Thu, 22 Jul 2010 20:46:16 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor von virtueller Klasse on Thu, 22 Jul 2010 20:54:42 GMT]]></title><description><![CDATA[<blockquote>
<p>Nein, du allokierst im Konstruktor keinen dynamischen Speicher, sondern weist deinem Member (Pointer) einen Wert zu. Die Allokation hat bereits vor dem Konstruktor stattgefunden. Der der den Speicher da allokiert hat, ist auch fürs Zerstören verantwortlich.</p>
</blockquote>
<p>Pardon, ich wollte hier nur ein Minimalbeispiel angeben und hab dabei Mist gebaut. In meinem *eigentlichen* Konstruktor allokiere ich Speicher. Habe das oben mal editiert.</p>
<blockquote>
<p>Dann implementier den Destruktor halt. Du kannst eine Funktion (auch den Destruktor) dennoch virtuell machen, auch wenn er einen Funktionskörper hat.</p>
</blockquote>
<p>Gut, mehr wollte ich nicht wissen.</p>
<p>Vielen Dank.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1930300</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1930300</guid><dc:creator><![CDATA[matthias00]]></dc:creator><pubDate>Thu, 22 Jul 2010 20:54:42 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor von virtueller Klasse on Thu, 22 Jul 2010 21:53:29 GMT]]></title><description><![CDATA[<p>Wenn du benutzerdefinierte Kopiersemantik brauchst, z.B. bei manueller Speicherverwaltung, dann halte dich an die Regel der Grossen Drei und implementiere zum Destruktor zusätzlich einen Kopierkonstruktor und Zuweisungsoperator. Oder – was in polymorphen Kontexten oft sinnvoll ist – verbiete diese beiden Methoden durch Deklaration ohne Definition im <code>private</code> -Bereich.</p>
<p>Aber einfach nichts tun ist keine Option, weil die vom Compiler generierten Methoden nicht das Richtige tun und unter Umständen böse mühsame Laufzeitfehler erzeugen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1930330</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1930330</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 22 Jul 2010 21:53:29 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor von virtueller Klasse on Thu, 22 Jul 2010 22:15:40 GMT]]></title><description><![CDATA[<p>Inbesondere wenn man solche Objekte in STL Container speichert, die darauf bauen, dass es korrekte Zuweisungsoperatoren, etc. gibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1930339</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1930339</guid><dc:creator><![CDATA[mmmm]]></dc:creator><pubDate>Thu, 22 Jul 2010 22:15:40 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor von virtueller Klasse on Fri, 23 Jul 2010 06:02:03 GMT]]></title><description><![CDATA[<p>mmmm schrieb:</p>
<blockquote>
<p>Inbesondere wenn man solche Objekte in STL Container speichert, die darauf bauen, dass es korrekte Zuweisungsoperatoren, etc. gibt.</p>
</blockquote>
<p>AFAIK ist je nach Container der operator= oder der Copy-CTor notwendig. Kenn mich leider im Standard nicht wirklich aus, bin mir aber sicher dass das dem Implementierer der STL überlassen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1930374</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1930374</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Fri, 23 Jul 2010 06:02:03 GMT</pubDate></item></channel></rss>