<?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[abstrakte Methode aus Destruktor aufrufen ...]]></title><description><![CDATA[<p>... geht nicht. Mein MinGW meckert das an. Über folgenden Umweg allerdings funktioniert es:</p>
<pre><code class="language-cpp">class test
{
	public:
		int a;

		void testFunk(){abstracte_func();};
		~test(){testFunk();};
		virtual void abstracte_func() = 0;
};

class testb : public test
{
	public:
		void abstracte_func();
};

void testb::abstracte_func()
{
	a = 5;
}
</code></pre>
<p>Das macht mich etwas stutzig ... wieso kann man nicht abstracte_func direkt aus ~test aufrufen - und mache ich etwas falsch, wenn ich das sozusagen 'hintenrum' doch tue?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/228268/abstrakte-methode-aus-destruktor-aufrufen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 29 Sep 2026 17:00:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/228268.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 26 Nov 2008 09:19:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to abstrakte Methode aus Destruktor aufrufen ... on Wed, 26 Nov 2008 09:19:45 GMT]]></title><description><![CDATA[<p>... geht nicht. Mein MinGW meckert das an. Über folgenden Umweg allerdings funktioniert es:</p>
<pre><code class="language-cpp">class test
{
	public:
		int a;

		void testFunk(){abstracte_func();};
		~test(){testFunk();};
		virtual void abstracte_func() = 0;
};

class testb : public test
{
	public:
		void abstracte_func();
};

void testb::abstracte_func()
{
	a = 5;
}
</code></pre>
<p>Das macht mich etwas stutzig ... wieso kann man nicht abstracte_func direkt aus ~test aufrufen - und mache ich etwas falsch, wenn ich das sozusagen 'hintenrum' doch tue?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1620971</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1620971</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Wed, 26 Nov 2008 09:19:45 GMT</pubDate></item><item><title><![CDATA[Reply to abstrakte Methode aus Destruktor aufrufen ... on Wed, 26 Nov 2008 09:27:42 GMT]]></title><description><![CDATA[<p>Ich vermute mal, weil wenn test::~test() aufgerufen wird, das testtb schon zerstört wurde (mittels testb:::~testb()). Somit ist auch die Implementierung der abstrakten Methode nicht mehr vorhanden.</p>
<p>Bei test::test_funk() wird es einfach nur Glück sein. Weil test::test_funk() ja nicht weiß, das es aus dem dtor aufgerufen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1620977</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1620977</guid><dc:creator><![CDATA[Vermuter]]></dc:creator><pubDate>Wed, 26 Nov 2008 09:27:42 GMT</pubDate></item><item><title><![CDATA[Reply to abstrakte Methode aus Destruktor aufrufen ... on Wed, 26 Nov 2008 09:28:26 GMT]]></title><description><![CDATA[<p>wenn du im destruktor der basisklasse die funktion aufrufst, ist die instanz der ableitenden klasse schon zerstört. da die funktion in der basisklasse nicht implementiert ist und ableitende objekte nicht mehr existieren, ist keine klasse mehr beteiligt, die die funktion bereitstellen könnte. sie trotzdem aufzurufen dürfte zu undefiniertem verhalten führen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1620978</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1620978</guid><dc:creator><![CDATA[vtable inspector]]></dc:creator><pubDate>Wed, 26 Nov 2008 09:28:26 GMT</pubDate></item><item><title><![CDATA[Reply to abstrakte Methode aus Destruktor aufrufen ... on Wed, 26 Nov 2008 09:38:38 GMT]]></title><description><![CDATA[<p>weil der Destruktur der Basisklasse nach dem Löschen der abgeleiteten Klasse aufgerufen wird.</p>
<p>Kannst es dir anschauen, indem du zum Test im ctor und dtor jeweils ein cout einbaust :</p>
<pre><code class="language-cpp">class Base
{
public:
  Base() { std::cout &lt;&lt; &quot;ctor Base&quot; &lt;&lt; std::endl; }
  ~Base(){ std::cout &lt;&lt; &quot;dtor Base&quot; &lt;&lt; std::endl; }
};

class Derived : public Base
{
 public:
  Derived () { std::cout &lt;&lt; &quot;ctor Derived &quot; &lt;&lt; std::endl; }
  ~Derived (){ std::cout &lt;&lt; &quot;dtor Derived &quot; &lt;&lt; std::endl; }
};

int main()
{
   {
      Derived dummy;
   }
}
</code></pre>
<pre><code>ctor Base
ctor Derived
dtor Derived
dtor Base
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1620979</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1620979</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Wed, 26 Nov 2008 09:38:38 GMT</pubDate></item><item><title><![CDATA[Reply to abstrakte Methode aus Destruktor aufrufen ... on Wed, 26 Nov 2008 09:38:21 GMT]]></title><description><![CDATA[<p>Belli schrieb:</p>
<blockquote>
<p>... geht nicht ...</p>
</blockquote>
<p>Grundsätzliche Regel:<br />
Niemals eine virtuelle Funktion im Konstruktor oder Destruktor aufrufen. Es sei den, du bist dir der Konsequenzen wohl bewusst.</p>
<p>Ich verstehe aber eh nicht warum du eine virtuelle Funktion im Destruktor aufrufen möchtest. Bzw. Warum machst du den Aufruf nicht in dem Destruktor der entsprechenden Klasse.</p>
<p>Edit: Und destruktoren von Basisklassen sollte man zudem &quot;virtual&quot; deklarieren...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1620988</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1620988</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Wed, 26 Nov 2008 09:38:21 GMT</pubDate></item><item><title><![CDATA[Reply to abstrakte Methode aus Destruktor aufrufen ... on Wed, 26 Nov 2008 09:49:26 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p>Belli schrieb:</p>
<blockquote>
<p>... geht nicht ...</p>
</blockquote>
<p>Grundsätzliche Regel:<br />
Niemals eine virtuelle Funktion im Konstruktor oder Destruktor aufrufen. Es sei den, du bist dir der Konsequenzen wohl bewusst.</p>
<p>Ich verstehe aber eh nicht warum du eine virtuelle Funktion im Destruktor aufrufen möchtest. Bzw. Warum machst du den Aufruf nicht in dem Destruktor der entsprechenden Klasse.</p>
<p>Edit: Und destruktoren von Basisklassen sollte man zudem &quot;virtual&quot; deklarieren...</p>
</blockquote>
<p>Klar mit dem virtual deklarieren des Destruktors, hab ich beim Zusammenklimpern des Beispiels übersehen.</p>
<p>Ansonsten danke an alle, ich hab fast befürchtet, daß das nicht geht.<br />
Warum ich das machen will/wollte?<br />
Ich mach im D'tor verschiedene Aufräumarbeiten. Die abstrakte Methode sieht in den abgeleiteten Klassen jeweils anders aus.<br />
Allerdings kann ich wohl genau diese zuerst im D'tor der abgeleiteten Klassen aufrufen, und den Rest im D'tor der Basisklasse lassen, denke ich?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1620997</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1620997</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Wed, 26 Nov 2008 09:49:26 GMT</pubDate></item><item><title><![CDATA[Reply to abstrakte Methode aus Destruktor aufrufen ... on Wed, 26 Nov 2008 09:56:57 GMT]]></title><description><![CDATA[<p>Belli schrieb:</p>
<blockquote>
<p>Allerdings kann ich wohl genau diese zuerst im D'tor der abgeleiteten Klassen aufrufen, und den Rest im D'tor der Basisklasse lassen, denke ich?</p>
</blockquote>
<p>Genau. Jede Klasse räumt ihren eigenen &quot;Schmutz&quot; weg. Nur so ist der Code am Ende konsistent</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1621001</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1621001</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Wed, 26 Nov 2008 09:56:57 GMT</pubDate></item></channel></rss>