<?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[Wann Virtueller Desktruktur?]]></title><description><![CDATA[<p>Hi,<br />
Wann braucht man einen Virtuellen Destruktur? Wenn man eine Basisklasse hat die virtuell sein soll, das leuchtet ein! Meistens hat man noch mindestens eine virtuelle Funktion, sonst halt nur den virtuellen Desktruktor!<br />
Aber es gibt auch andere Fälle wo man einen virtuellen Destruktor braucht, was mir nicht ganz klar ist! zb.: man hat eine Basisklasse Array und von dieser leitet man die Klasse NamedArray ab!</p>
<pre><code class="language-cpp">template&lt;class T&gt;
class Array {
public:
   Array(int lowBound, int highBound);
   ~Array();
private:
   vector(T) data;
   unsigned int size;
   int lBound, hBound;
};

template&lt;class T&gt;
class NamedArray : public Array(T) {
public:
   NamedArray(int lowBound, int highBound, const string&amp; name);
...
private:
   string arrayName;
};

NamedArray&lt;int&gt; *pna = new NamedArray&lt;int&gt;(10, 20, &quot;Impending Doom&quot;);
Array&lt;int&gt; *pa;
pa = pna; // NamedArray&lt;int&gt;* -&gt; Array&lt;int&gt;*  ...warum nicht Array&lt;int&gt;* -&gt; NamedArray&lt;int&gt;*??? sag ich da nicht das pa auf pna zeigen soll?

delete pa; // undefiniert?
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/156093/wann-virtueller-desktruktur</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 19:43:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/156093.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 13 Aug 2006 08:45:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wann Virtueller Desktruktur? on Sun, 13 Aug 2006 08:45:56 GMT]]></title><description><![CDATA[<p>Hi,<br />
Wann braucht man einen Virtuellen Destruktur? Wenn man eine Basisklasse hat die virtuell sein soll, das leuchtet ein! Meistens hat man noch mindestens eine virtuelle Funktion, sonst halt nur den virtuellen Desktruktor!<br />
Aber es gibt auch andere Fälle wo man einen virtuellen Destruktor braucht, was mir nicht ganz klar ist! zb.: man hat eine Basisklasse Array und von dieser leitet man die Klasse NamedArray ab!</p>
<pre><code class="language-cpp">template&lt;class T&gt;
class Array {
public:
   Array(int lowBound, int highBound);
   ~Array();
private:
   vector(T) data;
   unsigned int size;
   int lBound, hBound;
};

template&lt;class T&gt;
class NamedArray : public Array(T) {
public:
   NamedArray(int lowBound, int highBound, const string&amp; name);
...
private:
   string arrayName;
};

NamedArray&lt;int&gt; *pna = new NamedArray&lt;int&gt;(10, 20, &quot;Impending Doom&quot;);
Array&lt;int&gt; *pa;
pa = pna; // NamedArray&lt;int&gt;* -&gt; Array&lt;int&gt;*  ...warum nicht Array&lt;int&gt;* -&gt; NamedArray&lt;int&gt;*??? sag ich da nicht das pa auf pna zeigen soll?

delete pa; // undefiniert?
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1116355</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116355</guid><dc:creator><![CDATA[-cpp-]]></dc:creator><pubDate>Sun, 13 Aug 2006 08:45:56 GMT</pubDate></item><item><title><![CDATA[Reply to Wann Virtueller Desktruktur? on Sun, 13 Aug 2006 09:06:03 GMT]]></title><description><![CDATA[<p>theorettisch brauchste immer nen virtuellen Destruktor, wenn du öffentlich erbst.<br />
denn ein nasenbär1 wird kommen und dein abgeleitetes objekt in einen basisklassenzeiger stopfen und löschen.<br />
theorettisch brauchste immer nen virtuellen Destruktor.<br />
denn es wird ein nasenbär2 kommen und von deiner klasse öffentlich erben.</p>
<p>die frage ist also, wann du auf nen virtuellen destruktor verzichten magst. immerhin frißt das ding speicher und macht lahm.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1116363</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116363</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 13 Aug 2006 09:06:03 GMT</pubDate></item><item><title><![CDATA[Reply to Wann Virtueller Desktruktur? on Sun, 13 Aug 2006 09:23:49 GMT]]></title><description><![CDATA[<p>hi, ich glaub ich versteh es! ohne virtuellen destr. wird das falsche objekt gelöscht?</p>
<p>pa = pna; // da zeigt einfach das Array&lt;int&gt; *pa auch noch auf NamedArray! also insgesamt 2 pointer auf 1 objekt<br />
delete pa; // und der destr. der basisklasse nicht virtuelle ist dann kann hier nur ein Objekt Array&lt;int&gt; geleoscht werden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1116370</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116370</guid><dc:creator><![CDATA[-cpp-]]></dc:creator><pubDate>Sun, 13 Aug 2006 09:23:49 GMT</pubDate></item><item><title><![CDATA[Reply to Wann Virtueller Desktruktur? on Sun, 13 Aug 2006 09:33:53 GMT]]></title><description><![CDATA[<p>-cpp- schrieb:</p>
<blockquote>
<p>hi, ich glaub ich versteh es! ohne virtuellen destr. wird das falsche objekt gelöscht?</p>
<p>pa = pna; // da zeigt einfach das Array&lt;int&gt; *pa auch noch auf NamedArray! also insgesamt 2 pointer auf 1 objekt<br />
delete pa; // und der destr. der basisklasse nicht virtuelle ist dann kann hier nur ein Objekt Array&lt;int&gt; geleoscht werden?</p>
</blockquote>
<p>klingt ganz gescheit.</p>
<p>mach doch mal schnell</p>
<pre><code class="language-cpp">for(;;}{
   NamedArray&lt;int&gt; *pna = new NamedArray&lt;int&gt;(10, 20, &quot;Impending Doom&quot;); 
   Array&lt;int&gt; *pa = pna;
   delete pa;
}
</code></pre>
<p>und drück dann strg+entf und mach den task-manager auf. schau auf &quot;Verlauf der Auslagerungsdateiauslastung&quot;.<br />
dir sollte ein klitzekleines speicherloch auffallen, das entsteht, weil der destruktor von Array aufgerufen wird und der hat keinen blassen schimmer von der existenz des strings und ruft deswegen nicht den destruktor des strings auf.<br />
die kurve knickt ab, weil das speicherbesorgen deutlich langsamer wird, wenn die auslagerungsdatei benötigt wird, weil das ram alle ist. danach könnte sie nochma knicken, wenn die auslagrungsdatei wächst. und kurz vor ende ist der rechner nicht mehr gut ansprechbar. wenn dein prozess aber dann gestorben wird, ist alles wieder schnell, das ram wird von betriebssystem zuverlässig zurückgeholt bei prozessende.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1116374</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116374</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 13 Aug 2006 09:33:53 GMT</pubDate></item><item><title><![CDATA[Reply to Wann Virtueller Desktruktur? on Sun, 13 Aug 2006 09:48:07 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template&lt;class T&gt;
class Arr 
{
public:
   Arr(int lowBound, int highBound): lBound(lowBound), hBound(hBound) {}
   ~Arr() { cout &lt;&lt; &quot;~Arr()&quot; &lt;&lt; endl; }
private:
   vector&lt;T&gt; data;
   unsigned int size;
   int lBound, hBound;
};

template&lt;class U&gt;
class NamedArr : public Arr&lt;U&gt; {
public:
	NamedArr(int lowBound, int highBound, const string&amp; name): Arr(lowBound, highBound), arrayName(name) {}
   ~NamedArr() { cout &lt;&lt; &quot;~NamedArray()&quot; &lt;&lt; endl; }
private:
   string arrayName;
};

int main()
{
	NamedArr&lt;int&gt; *pna = new NamedArr&lt;int&gt;(10, 20, &quot;Impending Doom&quot;);
	Arr&lt;int&gt; *pa;
	pa = pna;

	delete pa;

	cin.get();
	return 0;
}
</code></pre>
<p>so wird bei mir ~Arr() aufgerufen! das ja falsch denn das Objekt ist vom typ NamedArr!! mit virtual desktr in Basisklasse gehts richtig!<br />
cu</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1116382</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116382</guid><dc:creator><![CDATA[-cpp-]]></dc:creator><pubDate>Sun, 13 Aug 2006 09:48:07 GMT</pubDate></item><item><title><![CDATA[Reply to Wann Virtueller Desktruktur? on Sun, 13 Aug 2006 10:38:02 GMT]]></title><description><![CDATA[<p>warum will man überhaupt das var und objekt typ unterschiedlich sind?</p>
<pre><code class="language-cpp">Arr&lt;int&gt; *pna = new NamedArr&lt;int&gt;(10, 20, &quot;Impending Doom&quot;);
</code></pre>
<p>cu</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1116391</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116391</guid><dc:creator><![CDATA[-cpp-]]></dc:creator><pubDate>Sun, 13 Aug 2006 10:38:02 GMT</pubDate></item><item><title><![CDATA[Reply to Wann Virtueller Desktruktur? on Sun, 13 Aug 2006 10:51:44 GMT]]></title><description><![CDATA[<p>-cpp- schrieb:</p>
<blockquote>
<p>warum will man überhaupt das var und objekt typ unterschiedlich sind?</p>
<pre><code class="language-cpp">Arr&lt;int&gt; *pna = new NamedArr&lt;int&gt;(10, 20, &quot;Impending Doom&quot;);
</code></pre>
<p>cu</p>
</blockquote>
<p>nicht bei Array und NamedArray.<br />
aber wenn man verschiedene objekttypen in einer gemeinsamen liste verwalten will. dann stopft man basisklassenzeiger in nen Vector&lt;Basis*&gt; und drin sind in wirklichkeit auch erbende dinge.<br />
mal als beispiel ein spiel mit Ritter, Bogenschütze, Lanzenträger und alle erben von LandArmee. und der ganze spielstand ist praktisch nur ein Vector&lt;Armee*&gt; u´nd das ist fürchterlich praktisch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1116394</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116394</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 13 Aug 2006 10:51:44 GMT</pubDate></item><item><title><![CDATA[Reply to Wann Virtueller Desktruktur? on Sun, 13 Aug 2006 14:17:37 GMT]]></title><description><![CDATA[<p>ja zb man hat eine List als Basisklasse! dann leitet man class Arraylist : public List ab und class Linkedlist : public List ab!?<br />
Die Basisklasse List hat dann zb deine virtuelle Methode print_all!<br />
und in der vector&lt;List*&gt; m_list; speichert man dann objekte vom typ Arraylist und vom typ Linkedlist?<br />
wenn man dann macht</p>
<pre><code class="language-cpp">m_list.push_back(new LinkedList()); m_list[0]-&gt;print_all();
</code></pre>
<p>?? meinst du das so?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1116495</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116495</guid><dc:creator><![CDATA[-cpp-]]></dc:creator><pubDate>Sun, 13 Aug 2006 14:17:37 GMT</pubDate></item><item><title><![CDATA[Reply to Wann Virtueller Desktruktur? on Sun, 13 Aug 2006 16:28:53 GMT]]></title><description><![CDATA[<p>jo, bis auf die tatsache, daß man listen nicht in eine vererbungshierarchie stopft, ist es das, was ich meinen tue.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1116561</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116561</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 13 Aug 2006 16:28:53 GMT</pubDate></item></channel></rss>