<?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[C++ Antipattern?]]></title><description><![CDATA[<p>Was haltet ihr von sowas?</p>
<pre><code class="language-cpp">class Foo{
	virtual void x(){};
};

class Bar{
};

template&lt;class T&gt; 
class Helper : public Foo, public T{
};

void call(Foo* foo) {
	if(dynamic_cast&lt;Bar*&gt;(foo) != NULL) {
		std::cout&lt;&lt;&quot;bar&quot;;
	}
}

int main(int argc, char** argv) {

	Helper&lt;Bar&gt; h;

	call(&amp;h);

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/210753/c-antipattern</link><generator>RSS for Node</generator><lastBuildDate>Tue, 13 Oct 2026 17:31:04 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/210753.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 14 Apr 2008 18:44:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to C++ Antipattern? on Mon, 14 Apr 2008 18:44:01 GMT]]></title><description><![CDATA[<p>Was haltet ihr von sowas?</p>
<pre><code class="language-cpp">class Foo{
	virtual void x(){};
};

class Bar{
};

template&lt;class T&gt; 
class Helper : public Foo, public T{
};

void call(Foo* foo) {
	if(dynamic_cast&lt;Bar*&gt;(foo) != NULL) {
		std::cout&lt;&lt;&quot;bar&quot;;
	}
}

int main(int argc, char** argv) {

	Helper&lt;Bar&gt; h;

	call(&amp;h);

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1492024</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1492024</guid><dc:creator><![CDATA[Anti]]></dc:creator><pubDate>Mon, 14 Apr 2008 18:44:01 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Antipattern? on Mon, 14 Apr 2008 20:06:49 GMT]]></title><description><![CDATA[<p>Hat die Frage auch noch nen Inhalt?</p>
<p>Abgesehen davon: klar, Antipattern pur. Außerdem müssen Foo und Bar virtuelle Destruktoren erhalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1492088</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1492088</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Mon, 14 Apr 2008 20:06:49 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Antipattern? on Tue, 15 Apr 2008 06:24:01 GMT]]></title><description><![CDATA[<p>Konrad Rudolph schrieb:</p>
<blockquote>
<p>Hat die Frage auch noch nen Inhalt?</p>
<p>Abgesehen davon: klar, Antipattern pur. Außerdem müssen Foo und Bar virtuelle Destruktoren erhalten.</p>
</blockquote>
<p>Warum müssen? Ich sehe keinen Grund. Ein virtueller Destruktor ist nur dann notwendig, wenn ich die Klasse über einen Zeiger auf die Basisklasse lösche. In dem Fall wäre der Destruktor der abgeleiteten Klasse nicht erreichbar, wenn er nicht virtuell wäre. In dem Beispiel ist das aber kein Problem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1492202</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1492202</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Tue, 15 Apr 2008 06:24:01 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Antipattern? on Tue, 15 Apr 2008 06:47:43 GMT]]></title><description><![CDATA[<p>tntnet schrieb:</p>
<blockquote>
<p>Konrad Rudolph schrieb:</p>
<blockquote>
<p>Hat die Frage auch noch nen Inhalt?</p>
<p>Abgesehen davon: klar, Antipattern pur. Außerdem müssen Foo und Bar virtuelle Destruktoren erhalten.</p>
</blockquote>
<p>Warum müssen? Ich sehe keinen Grund. Ein virtueller Destruktor ist nur dann notwendig, wenn ich die Klasse über einen Zeiger auf die Basisklasse lösche.</p>
</blockquote>
<p>Eben. Und wer sagt denn, dass das nicht (in Zukunft) irgendwann passiert?</p>
<p>Die Regel ist doch ganz einfach: sobald ich einen Zeiger auf die Basisklasse erstelle, besteht die Gefahr, dass ich diesen entsorgt. Oder noch einfacher: Wenn eine Klasse als Basisklasse einer anderen Klasse agieren soll, dann braucht sie einen virtuellen Destruktor.</p>
<p>Unter beschränkenden Annahmen (z.B. wenn ich sicher bin, dass ich nie einen Zeiger manuell per 'delete' lösche) gilt diese Regel zwar nicht mehr, aber sie ist trotzdem eine gute Faustregel. Wenn mir jemand ein allgemeines Stück Code wie das obige zeigt, ohne dass er durch dokumentierende Kommentare ausdrücklich darauf hinweist, dass diese Klasse *nicht* wie oben erwähnt eingesetzt werden kann, dann braucht sie einen virtuellen Destruktor, alles andere kommt einer Garantie für Desaster gleich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1492211</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1492211</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Tue, 15 Apr 2008 06:47:43 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Antipattern? on Tue, 15 Apr 2008 07:27:05 GMT]]></title><description><![CDATA[<p>Destruktoren von Klassen, die als Basis Klasse dienen:<br />
Entweder:<br />
- public virtual (auf der Basis Klasse wird delete aufgerufen)<br />
oder<br />
- protected non- virtual (auf der Basis Klasse kann kein delete aufgerufen werden).</p>
<p>Gruss SImon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1492238</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1492238</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Tue, 15 Apr 2008 07:27:05 GMT</pubDate></item></channel></rss>