<?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[Destruktoraufruf]]></title><description><![CDATA[<p>Hallo,<br />
ich habe eine Klasse von der ich ableite. Den Super-Konstruktor rufe ich bereits auf.<br />
Nun würde ich gerne im Destruktor auch noch den Super-Destruktor aufrufen. Geht das?<br />
Wenn ja, wie?</p>
<p>Vielen dank</p>
<pre><code class="language-cpp">class SuperClass()
{
	SuperClass(int a)
	{
		...
	}

	~SuperClass(void)
	{
		...
	}
}

class SubClass() : public SuperClass
{
	SubClass(int a) : SuperClass(a)
	{
		...
	}

	~SubClass(void)
	{
		?????? -&gt;Destruktoraufruf von SuperClass
	}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/286879/destruktoraufruf</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 17:29:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/286879.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 18 May 2011 07:51:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Destruktoraufruf on Wed, 18 May 2011 07:51:44 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe eine Klasse von der ich ableite. Den Super-Konstruktor rufe ich bereits auf.<br />
Nun würde ich gerne im Destruktor auch noch den Super-Destruktor aufrufen. Geht das?<br />
Wenn ja, wie?</p>
<p>Vielen dank</p>
<pre><code class="language-cpp">class SuperClass()
{
	SuperClass(int a)
	{
		...
	}

	~SuperClass(void)
	{
		...
	}
}

class SubClass() : public SuperClass
{
	SubClass(int a) : SuperClass(a)
	{
		...
	}

	~SubClass(void)
	{
		?????? -&gt;Destruktoraufruf von SuperClass
	}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2065045</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2065045</guid><dc:creator><![CDATA[C Anfänger]]></dc:creator><pubDate>Wed, 18 May 2011 07:51:44 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktoraufruf on Wed, 18 May 2011 07:55:18 GMT]]></title><description><![CDATA[<p>Der Destruktor wird automatisch aufgerufen, nachdem dein Destruktor fertig ist. Das kannst du auch nicht verhindern.<br />
Der Defaultkonstruktor wird übrigens auch automatisch aufgerufen (vor deinem Konstruktor). Wenn es keinen Default-Konstruktor gibt und du nicht manuell einen anderen Konstruktor aufrufst, gibt es einen Fehler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2065051</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2065051</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Wed, 18 May 2011 07:55:18 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktoraufruf on Wed, 18 May 2011 08:20:36 GMT]]></title><description><![CDATA[<p>Danke für die schnelle Antwort.</p>
<p>Ist es ratsam den Destruktor virtuell zu machen oder bleibt sich das gleich?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2065068</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2065068</guid><dc:creator><![CDATA[C Anfänger]]></dc:creator><pubDate>Wed, 18 May 2011 08:20:36 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktoraufruf on Wed, 18 May 2011 08:26:10 GMT]]></title><description><![CDATA[<p>Bei Klassen die als Basis / Interface dienen:<br />
Destruktor entweder public virtual ODER protected non-virtual.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2065073</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2065073</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Wed, 18 May 2011 08:26:10 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktoraufruf on Wed, 18 May 2011 09:46:55 GMT]]></title><description><![CDATA[<p>Ist es nicht immer so, dass der Destruktor der abgeleitetn Klasse zuerst aufgerufen wird und dann immer automatish, ob man es will oder nicht, der Destruktor der Mutterklasse aufgerufen wird.</p>
<p>So ähnlich läuft es doch mit den Konstruktoren. Erst wird der Konstruktor der Mutterklasse, dann der der abgeleiteten Klasse aufgerufen.</p>
<p>lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2065131</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2065131</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Wed, 18 May 2011 09:46:55 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktoraufruf on Wed, 18 May 2011 10:00:56 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>Ist es nicht immer so, dass der Destruktor der abgeleitetn Klasse zuerst aufgerufen wird und dann immer automatish, ob man es will oder nicht, der Destruktor der Mutterklasse aufgerufen wird.<br />
So ähnlich läuft es doch mit den Konstruktoren. Erst wird der Konstruktor der Mutterklasse, dann der der abgeleiteten Klasse aufgerufen.<br />
lg, freakC++</p>
</blockquote>
<p>Ja, richtig.</p>
<pre><code class="language-cpp">SubKlasse* sub=new SubKlasse;
delete sub;//ruft ~SubKlasse auf und der ruft am Ende automatisch ~Superklasse auf.
</code></pre>
<p>Aber</p>
<pre><code class="language-cpp">SubKlasse* sub=new SubKlasse;
SuperKlasse* super=sub;//darf ja, weil vererbt
delete super;//Fall A: ~SuperKlasse ist nicht virtuell: Bumm, ~SubKlasse wird nicht aufgerufen. En eventueller string SubKlasse::str wird nicht destruiert. 
//Fall B: ~SuperKlasse ist virtuell. Zur Laufzeit wird der richtige Destruktoreinsprung gefunden, also ~SubKlasse (und der ruft bekanntlich am Ende automatisch ~Superklasse auf).
</code></pre>
<p>Und man kann davon ausgehen, daß der Benutzer irgendwann mal den Zeigertrick macht. Daher die Empfehlung, Basisklassendestruktoren generell virtuell zu machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2065143</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2065143</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 18 May 2011 10:00:56 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktoraufruf on Wed, 18 May 2011 11:21:51 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<pre><code class="language-cpp">SubKlasse* sub=new SubKlasse;
SuperKlasse* super=sub;//darf ja, weil vererbt
delete super;//Fall A: ~SuperKlasse ist nicht virtuell: Bumm, ~SubKlasse wird nicht aufgerufen. En eventueller string SubKlasse::str wird nicht destruiert.
</code></pre>
</blockquote>
<p>Korrigiere: Fall A: ~SuperKlasse ist nicht virtuell. Bumm, <strong>undefiniertes Verhalten.</strong> Jetzt kann alles passieren, aber ziemlich sicher nicht was man möchte/erwartet.</p>
<blockquote>
<p>Und man kann davon ausgehen, daß der Benutzer irgendwann mal den Zeigertrick macht. Daher die Empfehlung, Basisklassendestruktoren generell virtuell zu machen.</p>
</blockquote>
<p>Alternativ protected und nicht virtuell, wie schon erwähnt. Verhindert Fall A und B, erlaubt nur das erste Beispiel.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2065202</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2065202</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 18 May 2011 11:21:51 GMT</pubDate></item></channel></rss>