<?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[Funktionszeiger und klasse]]></title><description><![CDATA[<p>hallo,<br />
ich frage mich folgendes:</p>
<p>einen zeiger &quot;klassenzeiger&quot; auf eine klasse &quot;Klasse1&quot;deklariere.</p>
<p>ich habe eine weitere klasse, die von klasse1 abgeleitet und gleichzeitig erweitert bzw. funktionen überschrieben wurde(n) (Ableitungsklasse).</p>
<p>führt so eine deklaration auf dauer zu einem fehler ?</p>
<p>Klasse *Klassenzeiger = new Ableitungsklasse;</p>
<p>es wird anstandslos compiliert und ausgeführt, aber führt das nicht zu fehlern ?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/163711/funktionszeiger-und-klasse</link><generator>RSS for Node</generator><lastBuildDate>Sun, 13 Sep 2026 11:44:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/163711.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 01 Nov 2006 09:47:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktionszeiger und klasse on Wed, 01 Nov 2006 09:47:20 GMT]]></title><description><![CDATA[<p>hallo,<br />
ich frage mich folgendes:</p>
<p>einen zeiger &quot;klassenzeiger&quot; auf eine klasse &quot;Klasse1&quot;deklariere.</p>
<p>ich habe eine weitere klasse, die von klasse1 abgeleitet und gleichzeitig erweitert bzw. funktionen überschrieben wurde(n) (Ableitungsklasse).</p>
<p>führt so eine deklaration auf dauer zu einem fehler ?</p>
<p>Klasse *Klassenzeiger = new Ableitungsklasse;</p>
<p>es wird anstandslos compiliert und ausgeführt, aber führt das nicht zu fehlern ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1166003</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1166003</guid><dc:creator><![CDATA[fragenmacher]]></dc:creator><pubDate>Wed, 01 Nov 2006 09:47:20 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger und klasse on Wed, 01 Nov 2006 09:52:34 GMT]]></title><description><![CDATA[<p>An dem Code-Schnipselchen ist noch alles in Ordnung, nur solltest du dafür einige Punkte beachten:</p>
<ul>
<li>Die Basisklasse benötigt einen virtuellen Destruktor, sonst wird dein Objekt von delete nur halb gelöscht</li>
<li>alle wichtigen Funktionen der Klasse sollten virtuell sein, sonst führt <code>Klassenzeiger-&gt;Methode()</code> nur die Methode der Basisklasse aus</li>
<li>du kannst auf diesem Weg nur Funktionen der Basisklasse verwenden</li>
</ul>
]]></description><link>https://www.c-plusplus.net/forum/post/1166008</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1166008</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 01 Nov 2006 09:52:34 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger und klasse on Wed, 01 Nov 2006 10:26:53 GMT]]></title><description><![CDATA[<blockquote>
<p>Die Basisklasse benötigt einen virtuellen Destruktor, sonst wird dein Objekt von delete nur halb gelöscht</p>
</blockquote>
<p><em>ähm</em> saublöde frage wie muss der dann aussehen ?</p>
<p>virtual ~Basisklasse() = 0; ?</p>
<p>was muss da denn ausgeführt werden, damit die abgeleitete klasse komplett gelöscht wird ?</p>
<blockquote>
<p>alle wichtigen Funktionen der Klasse sollten virtuell sein, sonst führt Klassenzeiger-&gt;Methode() nur die Methode der Basisklasse aus</p>
</blockquote>
<p>jepp, das ist schon so <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="🙂"
    /></p>
<blockquote>
<p>du kannst auf diesem Weg nur Funktionen der Basisklasse verwenden</p>
</blockquote>
<p>auch das ist mir recht, da die basisklasse alle funktionsdeklarationen enthalten soll, die man braucht. die in der abgeleiteten klasse sollten nicht direkt angesprochen werden können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1166043</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1166043</guid><dc:creator><![CDATA[fragenmacher]]></dc:creator><pubDate>Wed, 01 Nov 2006 10:26:53 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger und klasse on Wed, 01 Nov 2006 10:32:50 GMT]]></title><description><![CDATA[<p>fragenmacher schrieb:</p>
<blockquote>
<blockquote>
<p>Die Basisklasse benötigt einen virtuellen Destruktor, sonst wird dein Objekt von delete nur halb gelöscht</p>
</blockquote>
<p><em>ähm</em> saublöde frage wie muss der dann aussehen ?</p>
<p>virtual ~Basisklasse() = 0; ?</p>
</blockquote>
<p>Fast, nur das &quot;=0&quot; ist überflüssig.</p>
<p>Das Problem mit dem Destruktor ist, daß delete üblicherweise den statischen Typ des Objekts nutzt, um den Destruktor zu finden - das heißt er würde nur den Basis-Teil löschen und neue Elemente der abgeleiteten Klasse stehen lassen.<br />
Indem du den Destruktor virtuell definierst, landet er in der vtable der Klasse und beim delete erreichst du dann die &quot;richtige&quot; Version (sprich: den Destruktor der abgeleiteten Klasse).</p>
<blockquote>
<p>was muss da denn ausgeführt werden, damit die abgeleitete klasse komplett gelöscht wird ?</p>
</blockquote>
<p>Einfach ein &quot;virtual&quot; vor den Destruktor zu setzen reicht aus - den Rest kannst du, wenn nötig, ganz normal erledigen (nur für den Fall, daß du dich von Hand mit der Speicherverwaltung rumschlagen mußt).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1166051</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1166051</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 01 Nov 2006 10:32:50 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger und klasse on Wed, 01 Nov 2006 10:45:23 GMT]]></title><description><![CDATA[<p>perfekt! danke <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="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1166062</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1166062</guid><dc:creator><![CDATA[fragenmacher]]></dc:creator><pubDate>Wed, 01 Nov 2006 10:45:23 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger und klasse on Wed, 01 Nov 2006 15:28:54 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>An dem Code-Schnipselchen ist noch alles in Ordnung, nur solltest du dafür einige Punkte beachten:<br />
[list][*]Die Basisklasse benötigt einen virtuellen Destruktor, sonst wird dein Objekt von delete nur halb gelöscht</p>
</blockquote>
<blockquote>
<p>Das Problem mit dem Destruktor ist, daß delete üblicherweise den statischen Typ des Objekts nutzt, um den Destruktor zu finden - das heißt er würde nur den Basis-Teil löschen und neue Elemente der abgeleiteten Klasse stehen lassen.</p>
</blockquote>
<p>Das ist eine gefährlich Vereinfachung und ein weit verbreiteter Irrtum: ein delete über einen Basisklassenzeiger, der auf ein abgeleitetes Objekt zeigt führt zu *undefiniertem* Verhalten, nicht zu einem fehlenden Aufruf des Dtors der abgeleiteten Klasse. Das ist ein wichtiger Unterschied, den man spätestens dann erkennt, wenn kleine grüne Männchen aus dem Computer steigen und einem den Hintern versohlen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1166343</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1166343</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Wed, 01 Nov 2006 15:28:54 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger und klasse on Wed, 01 Nov 2006 16:47:30 GMT]]></title><description><![CDATA[<p>aber wie soll man denn dann solche objekte löschen, wenn delete auf basiszeiger undefiniertes verhalten auslöst?</p>
<pre><code class="language-cpp">// b1, b2 erben von b, b hat virtuellen desturktor
b* B = NULL;
int a;
cin &gt;&gt; a;
if(a == 1)
  B = new b1;
else
  B = new b2;

// mach was

delete B;
</code></pre>
<p>wenni ch doch nicht weiß, worauf B nun zeigt, wie soll ich es dann löschen...?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1166411</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1166411</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Wed, 01 Nov 2006 16:47:30 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger und klasse on Wed, 01 Nov 2006 16:49:31 GMT]]></title><description><![CDATA[<p>Maxi schrieb:</p>
<blockquote>
<p>wenni ch doch nicht weiß, worauf B nun zeigt, wie soll ich es dann löschen...?</p>
</blockquote>
<p>Die Antwort ist in diesem Thread bereits mehrfach gegeben worden...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1166412</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1166412</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 01 Nov 2006 16:49:31 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger und klasse on Wed, 01 Nov 2006 16:59:31 GMT]]></title><description><![CDATA[<p>HumeSikkins schrieb:</p>
<blockquote>
<p>Das ist eine gefährlich Vereinfachung und ein weit verbreiteter Irrtum: ein delete über einen Basisklassenzeiger, der auf ein abgeleitetes Objekt zeigt führt zu *undefiniertem* Verhalten, nicht zu einem fehlenden Aufruf des Dtors der abgeleiteten Klasse. Das ist ein wichtiger Unterschied, den man spätestens dann erkennt, wenn kleine grüne Männchen aus dem Computer steigen und einem den Hintern versohlen.</p>
</blockquote>
<p>gilt das nur für nicht-virtuelle destruktoren? hört sich so allgemein an</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1166424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1166424</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Wed, 01 Nov 2006 16:59:31 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger und klasse on Thu, 02 Nov 2006 09:44:25 GMT]]></title><description><![CDATA[<blockquote>
<p>Das ist eine gefährlich Vereinfachung und ein weit verbreiteter Irrtum: ein delete über einen Basisklassenzeiger, der auf ein abgeleitetes Objekt zeigt führt zu *undefiniertem* Verhalten, nicht zu einem fehlenden Aufruf des Dtors der abgeleiteten Klasse. Das ist ein wichtiger Unterschied, den man spätestens dann erkennt, wenn kleine grüne Männchen aus dem Computer steigen und einem den Hintern versohlen.</p>
</blockquote>
<p>soll ich daraus schliessen, dass man also so etwas wie:</p>
<p>basisklasse *basis:<br />
basis = new abgeleiteteklasse;</p>
<p>also nicht so einfach zu realisieren ist, weil man die objekte hinterher nicht los wird ?</p>
<p>ich meine selbst mit dem virtuellen destruktor ?</p>
<p>wie löst man das problem denn dann ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1166755</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1166755</guid><dc:creator><![CDATA[RML]]></dc:creator><pubDate>Thu, 02 Nov 2006 09:44:25 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger und klasse on Thu, 02 Nov 2006 10:07:24 GMT]]></title><description><![CDATA[<p>Keine Panik. Der virtuelle Destruktor löst das Problem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1166794</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1166794</guid><dc:creator><![CDATA[Mathias]]></dc:creator><pubDate>Thu, 02 Nov 2006 10:07:24 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger und klasse on Thu, 02 Nov 2006 13:01:45 GMT]]></title><description><![CDATA[<blockquote>
<p>Keine Panik. Der virtuelle Destruktor löst das Problem.</p>
</blockquote>
<p>Exakt. Meine Aussage bezog sich auf die Geschichte mit einem nicht-virtuellen Dtor.<br />
Um alle Mißverständnisse auszuschließen: wenn man über einen Base-Zeiger löschen will:<br />
virtueller Dtor: gut<br />
nicht-virtueller Dtor: böse (Begründung: Grüne Männchen)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1166944</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1166944</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Thu, 02 Nov 2006 13:01:45 GMT</pubDate></item></channel></rss>