<?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[pure virtual Methode in Destruktor aufrufen]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>folgendes Beispiel:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class A
{
public:
	virtual ~A() { stop(); }

	virtual void start() = 0;
	virtual void stop() = 0;
};

class B : public A
{
public:
	void start() {}
	void stop() {}
};

int main() {
	B b;
	return 0;
}
</code></pre>
<p>produziert unter VC2008 folgenden Linkerfehler<br />
&quot;error LNK2001: unresolved external symbol &quot;public: virtual void __thiscall A::stop(void)&quot; (?stop@A@@UAEXXZ)&quot;<br />
Kann mir jemand sagen, warum das nicht gehen soll?</p>
<p>Wenn ich dagegen den destructor durch &quot;virtual void test() { stop(); }&quot; ersetze, funktionierts einwandfrei.</p>
<p>Vielen Dank schonmal...<br />
C14</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/308740/pure-virtual-methode-in-destruktor-aufrufen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 05 Aug 2026 15:15:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/308740.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 04 Oct 2012 09:47:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to pure virtual Methode in Destruktor aufrufen on Thu, 04 Oct 2012 09:47:43 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>folgendes Beispiel:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class A
{
public:
	virtual ~A() { stop(); }

	virtual void start() = 0;
	virtual void stop() = 0;
};

class B : public A
{
public:
	void start() {}
	void stop() {}
};

int main() {
	B b;
	return 0;
}
</code></pre>
<p>produziert unter VC2008 folgenden Linkerfehler<br />
&quot;error LNK2001: unresolved external symbol &quot;public: virtual void __thiscall A::stop(void)&quot; (?stop@A@@UAEXXZ)&quot;<br />
Kann mir jemand sagen, warum das nicht gehen soll?</p>
<p>Wenn ich dagegen den destructor durch &quot;virtual void test() { stop(); }&quot; ersetze, funktionierts einwandfrei.</p>
<p>Vielen Dank schonmal...<br />
C14</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2256928</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2256928</guid><dc:creator><![CDATA[C14]]></dc:creator><pubDate>Thu, 04 Oct 2012 09:47:43 GMT</pubDate></item><item><title><![CDATA[Reply to pure virtual Methode in Destruktor aufrufen on Thu, 04 Oct 2012 09:50:42 GMT]]></title><description><![CDATA[<p>Objekte werden von aussen nach innen zerstört. Zuerst wird also der Destruktor von B durchlaufen (der noch auf Elemente von A zugreifen darf), dann der von A. Wenn der Destruktor von A durchlaufen wird, existiert der B-Teil des Objekts nicht mehr.</p>
<p>Da der Compiler dies schon zur Compilezeit weiß, versucht er beim Aufruf der virtuellen Methode nicht, die tatsächliche Implementierung zu finden, sondern ruft (wie bei einer nicht-virtuellen Methode) die Methode in A auf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2256931</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2256931</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 04 Oct 2012 09:50:42 GMT</pubDate></item><item><title><![CDATA[Reply to pure virtual Methode in Destruktor aufrufen on Thu, 04 Oct 2012 10:50:37 GMT]]></title><description><![CDATA[<p>Zu LordJaxoms Erklärung sei noch hinzuzufügen, dass sowas wie start/init und ähnliche Methoden selten eine gute Idee sind. Ich sage nicht <em>nie</em> ich sage selten. Bevor hier wieder irgendwelche Winkeladvokaten auf irgendeinen seltenen Fall verweisen, den man so lösen könnte...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2256947</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2256947</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 04 Oct 2012 10:50:37 GMT</pubDate></item><item><title><![CDATA[Reply to pure virtual Methode in Destruktor aufrufen on Thu, 04 Oct 2012 13:14:55 GMT]]></title><description><![CDATA[<p>Ahja, macht Sinn, danke für die schnelle Antwort.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a>:<br />
Konkret gings hier aber um ne webcam, die man mit start/stop an- und ausschaltet.<br />
Das soll man auch manuell machen können um zum Beispiel zwischenzeitlich die webcam auszuschalten.<br />
Die B-Klassen waren dann konkrete Implementierungen mit unterschiedlichen APIs.<br />
Wahrscheinlich wärs sinnvoller aber umständlicher die Implementierung als member zu machen?<br />
Ich mach das stop jetzt eben im destruktor der jeweiligen Implementierung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2256990</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2256990</guid><dc:creator><![CDATA[C14]]></dc:creator><pubDate>Thu, 04 Oct 2012 13:14:55 GMT</pubDate></item><item><title><![CDATA[Reply to pure virtual Methode in Destruktor aufrufen on Thu, 04 Oct 2012 14:13:29 GMT]]></title><description><![CDATA[<p>C14 schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a>:<br />
Konkret gings hier aber um ne webcam,.</p>
</blockquote>
<p>Einer der Gründe, warum es meist relativ sinnfrei ist, hier &quot;Beispielcode&quot; für ein reales Problem zu posten, statt den relevanten Code einfach nur per Copy &amp; Paste einzustellen - man unterschlägt willkürlich relevante Informationen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2257032</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2257032</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 04 Oct 2012 14:13:29 GMT</pubDate></item></channel></rss>