<?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[warnung: virtueller destruktor benötigt?]]></title><description><![CDATA[<p>hallo,<br />
hab folgendes problem</p>
<pre><code class="language-cpp">class A
{
    public:
        A(){};
        ~A(){};
};

class B :
    virtual public A
{
    public:
        virtual void b() = 0;
};

class C :
    virtual public B
{
    public:
        C(){};
        void b(){};
};

int main()
{
    A a;
    C c;
    return 0;
};
</code></pre>
<p>der compiler von Code::Blocks warnt mich nun das B und C einen virtuellen Destruktor benötigen. Tatsächlich reicht ein virtueller Destruktor bei B aus, aber was mich viel mehr interessiert ist, warum ich überhaupt die Warnung bekomme. Es muss etwas mit der virtual Vererbung zu tun haben, denn wenn ich das virtual weglasse brauche ich das nicht mehr machen. allerdings kann ich bei meinen tatsächlichen klassen dann das virtual nicht weglassen.<br />
Danke schonmal im voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/241077/warnung-virtueller-destruktor-benötigt</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 17:31:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/241077.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 15 May 2009 12:00:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to warnung: virtueller destruktor benötigt? on Fri, 15 May 2009 12:00:18 GMT]]></title><description><![CDATA[<p>hallo,<br />
hab folgendes problem</p>
<pre><code class="language-cpp">class A
{
    public:
        A(){};
        ~A(){};
};

class B :
    virtual public A
{
    public:
        virtual void b() = 0;
};

class C :
    virtual public B
{
    public:
        C(){};
        void b(){};
};

int main()
{
    A a;
    C c;
    return 0;
};
</code></pre>
<p>der compiler von Code::Blocks warnt mich nun das B und C einen virtuellen Destruktor benötigen. Tatsächlich reicht ein virtueller Destruktor bei B aus, aber was mich viel mehr interessiert ist, warum ich überhaupt die Warnung bekomme. Es muss etwas mit der virtual Vererbung zu tun haben, denn wenn ich das virtual weglasse brauche ich das nicht mehr machen. allerdings kann ich bei meinen tatsächlichen klassen dann das virtual nicht weglassen.<br />
Danke schonmal im voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1710962</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1710962</guid><dc:creator><![CDATA[StarCraftFeuerteufel]]></dc:creator><pubDate>Fri, 15 May 2009 12:00:18 GMT</pubDate></item><item><title><![CDATA[Reply to warnung: virtueller destruktor benötigt? on Fri, 15 May 2009 12:21:08 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>du musst eigentlich bei allen Funktionen (+ Destruktor)<br />
die du Vererben willst ein <code>virtual</code> davor setzen</p>
<p>also eigentlich auch bei <code>~A()</code></p>
<p>Gruß Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1710980</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1710980</guid><dc:creator><![CDATA[varginator]]></dc:creator><pubDate>Fri, 15 May 2009 12:21:08 GMT</pubDate></item><item><title><![CDATA[Reply to warnung: virtueller destruktor benötigt? on Fri, 15 May 2009 12:49:25 GMT]]></title><description><![CDATA[<p>ich hatte diese blöde warnung auch schon gelegentlich an unpassenden stellen. ich habe beschlossen, sie auszumachen, irgend einen compilerschalter dafür wirds schon geben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1711003</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1711003</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 15 May 2009 12:49:25 GMT</pubDate></item><item><title><![CDATA[Reply to warnung: virtueller destruktor benötigt? on Fri, 15 May 2009 13:19:22 GMT]]></title><description><![CDATA[<p>Klassen die virtuell erben und/oder neue virtuelle Funktionen deklarieren (neu = nicht geerbt in dem Fall) sind normalerweise als polymorphe Basisklassen gedacht. Sonst hätte es ja keinen Zweck, die Vererbung bzw. die Funktion virtuell zu machen. Und polymorphe Basisklassen sollten nunmal im Normalfall einen virtuellen Destruktor haben, damit polymorphes delete möglich ist. (delete auf einen Basisklassenpointer erzeugt undefiniertes verhalten, wenn der Dtor der Basisklasse nicht virtuell ist).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1711022</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1711022</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 15 May 2009 13:19:22 GMT</pubDate></item><item><title><![CDATA[Reply to warnung: virtueller destruktor benötigt? on Fri, 15 May 2009 13:32:54 GMT]]></title><description><![CDATA[<p>ich rede nicht von virtual funktionen sonder davon das ich A bzw B virtual vererbe. wenn ich den destruktor virtual setze, bedeutet das doch nur das er spät gebunden wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1711035</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1711035</guid><dc:creator><![CDATA[StarCraftFeuerteufel]]></dc:creator><pubDate>Fri, 15 May 2009 13:32:54 GMT</pubDate></item><item><title><![CDATA[Reply to warnung: virtueller destruktor benötigt? on Fri, 15 May 2009 14:08:18 GMT]]></title><description><![CDATA[<p>@FreakyBKA</p>
<p>Sie sollten Ihre Aufgaben in OOP lieber <strong>allein</strong> lösen. Nehmen Sie sich doch einfach ein gutes CPP-Buch, dann klappt es auch mit der Abnahme!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1711053</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1711053</guid><dc:creator><![CDATA[guterRat]]></dc:creator><pubDate>Fri, 15 May 2009 14:08:18 GMT</pubDate></item><item><title><![CDATA[Reply to warnung: virtueller destruktor benötigt? on Fri, 15 May 2009 15:05:07 GMT]]></title><description><![CDATA[<p>@guterRat: hää? check ich nicht!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1711079</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1711079</guid><dc:creator><![CDATA[StarCraftFeuerteufel]]></dc:creator><pubDate>Fri, 15 May 2009 15:05:07 GMT</pubDate></item><item><title><![CDATA[Reply to warnung: virtueller destruktor benötigt? on Fri, 15 May 2009 15:11:16 GMT]]></title><description><![CDATA[<p>das heißt also, dass ich meinen Destruktor bei A auch virtual machen muss? aber wird der dann trotzdem noch ausgeführt, wenn ich den Destruktor in B oder C aufrufe? Und in B muss ich dann auch noch einen virtual Destruktor reinpacken? eigentlich gibts in B nichts sinnvolles was der Destruktor ausführen soll. nur der Destruktor von A hat eine spezielle Aufgabe und der von C.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1711086</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1711086</guid><dc:creator><![CDATA[StarCraftFeuerteufel]]></dc:creator><pubDate>Fri, 15 May 2009 15:11:16 GMT</pubDate></item><item><title><![CDATA[Reply to warnung: virtueller destruktor benötigt? on Fri, 15 May 2009 15:11:46 GMT]]></title><description><![CDATA[<p>FreakyBKA schrieb:</p>
<blockquote>
<p>ich rede nicht von virtual funktionen sonder davon das ich A bzw B virtual vererbe.</p>
</blockquote>
<p>Der Compiler redet aber von virtuellen Funktionen <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>
<p>Da B eine virtuelle Methode enthält, sollte B auch einen virtuellen Desktruktor enthalten. Ich bin mir sogar ziemlich sicher, dass die Compilermeldung genau das aussagt (class with virtual functions but non-virtual destructor).</p>
<p>Die Begründung wurde schon genannt: Damit ein &quot;delete object&quot; mit decltype(object) == B auch dann definiert ist, wenn object auf ein C zeigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1711087</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1711087</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Fri, 15 May 2009 15:11:46 GMT</pubDate></item><item><title><![CDATA[Reply to warnung: virtueller destruktor benötigt? on Fri, 15 May 2009 15:28:25 GMT]]></title><description><![CDATA[<p>alles klar, jetzt hab ichs verstanden.<br />
wenn ich allerdings den Dtor in A schon virtual mache brauche ich in B keinen mehr einfügen da dieser ja schon den von A erbt und soweit ich weiß das virtual mit vererbt wird. sehe ich das richtig? zumindest spuckt mir der compiler keine warnung mehr aus, wenn ich nur in A einen virtual Dtor schreibe und den in B weglasse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1711092</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1711092</guid><dc:creator><![CDATA[StarCraftFeuerteufel]]></dc:creator><pubDate>Fri, 15 May 2009 15:28:25 GMT</pubDate></item><item><title><![CDATA[Reply to warnung: virtueller destruktor benötigt? on Fri, 15 May 2009 15:36:09 GMT]]></title><description><![CDATA[<p>FreakyBKA schrieb:</p>
<blockquote>
<p>wenn ich allerdings den Dtor in A schon virtual mache brauche ich in B keinen mehr einfügen da dieser ja schon den von A erbt und soweit ich weiß das virtual mit vererbt wird. sehe ich das richtig?</p>
</blockquote>
<p>Jein, der Destruktor wird nicht vererbt, jedes Objekt hat automatisch einen eigenen Destruktor, auch wenn man ihn nicht angibt. Wenn der Destruktor in der Basisklasse allerdings <code>virtual</code> ist, dann sind auch alle Destruktoren <code>virtual</code> , welche zu einer von der Basisklasse abgeleiteten Klasse gehören. Also auch die automatisch vom Compiler erstellten Destruktoren.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1711094</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1711094</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 15 May 2009 15:36:09 GMT</pubDate></item><item><title><![CDATA[Reply to warnung: virtueller destruktor benötigt? on Fri, 15 May 2009 16:07:06 GMT]]></title><description><![CDATA[<p>wo wir gerade dabei sind, habe ich gerade noch ein anderes problem entdeckt, wo ich nicht weiß warum man das so machen muss, vllt kann mir das ja jemand erklären.</p>
<pre><code class="language-cpp">class A
{
    public:
        A(){};
        virtual ~A(){};
};

template&lt;class t&gt;
class B :
	virtual public A
{
	public:
		class BB
		{
			private:
				t b;
			public:
				void bb(){};
		};
};

template&lt;class t&gt;
class D
{
	public:
		t _t;
};

template&lt;class t&gt;
class C :
	virtual private B&lt;t&gt;
{
	private:
	public:
		using B&lt;t&gt;::BB;
		C(){};
		~C(){};
		void c()
		{
			D&lt;typename BB&gt; d; // Fehler, hier muss &quot;typename B&lt;t&gt;::BB&quot; rein, aber warum?
			d._t.bb();
		};
};
</code></pre>
<p>gibt es irgendeine möglichkeit die subklasse BB von B in C direkt verfügbar zu machen mit using gehts offensichtlich nicht.</p>
<p>grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1711118</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1711118</guid><dc:creator><![CDATA[StarCraftFeuerteufel]]></dc:creator><pubDate>Fri, 15 May 2009 16:07:06 GMT</pubDate></item><item><title><![CDATA[Reply to warnung: virtueller destruktor benötigt? on Fri, 15 May 2009 16:10:51 GMT]]></title><description><![CDATA[<p>Das Problem hatten wir erst gerade:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-241013.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-241013.html</a></p>
<p>Gilt auch für &quot;Subklassen&quot;.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1711123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1711123</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 15 May 2009 16:10:51 GMT</pubDate></item><item><title><![CDATA[Reply to warnung: virtueller destruktor benötigt? on Fri, 15 May 2009 16:16:29 GMT]]></title><description><![CDATA[<p>alles klar, besten dank.<br />
<a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9752">@Dravere</a>: bist echt immer wieder eine große hilfe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1711127</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1711127</guid><dc:creator><![CDATA[StarCraftFeuerteufel]]></dc:creator><pubDate>Fri, 15 May 2009 16:16:29 GMT</pubDate></item></channel></rss>