<?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[Destruktor in abstrakter Basisklasse nötig?]]></title><description><![CDATA[<p>Hallo mal wieder.</p>
<p>Ich hab hier eine abstrakte Basisklasse (quasi ein C++ - Interface <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> ), um halt ein paar Funktionen für die ableitenden Klassen zu erzwingen.</p>
<p>Ich poste einfach mal den Code:</p>
<pre><code class="language-cpp">class IBase
{
    virtual doThis() = 0;
    virtual doThat() = 0;
};

class A: public IBase
{
    A();
    virtual ~A();
    virtual doThis();
    virtual doThat();
};

class B: public IBase
{
    B();
    virtual ~B();
    virtual doThis();
    virtual doThat();
};
</code></pre>
<p>Nun instanziiere ich nur eine dieser abgeleiteten Klassen, weil jede eine Spezialisierung ist und ich eben nur eine bestimmte haben will. Daher muss ich für die Instanz einen Pointer der Basisklasse nutzen.</p>
<pre><code class="language-cpp">IBase* pInstance;
switch(condition)
{
case 1: pInstance = new A();
        break;
case 2: pInstance = new B();
        break;
default:pInstance = NULL;
}
</code></pre>
<p>Nun meine Frage: Eigentlich brauch ich doch immer einen virtuellen Destruktor in der Basisklasse, wenn ich ein davon abgeleitetes Objekt zerstören will mittels</p>
<pre><code class="language-cpp">delete pInstance;
</code></pre>
<p>Wieso brauch ich das hier nicht? Zumindest meckern weder Compiler noch Linker rum. Und wenn ich einen virtuellen Destruktor in IBase einfügen will, dann meckert der Linker rum, obwohl der Destruktor in den Klassen A und B implementiert wurde...</p>
<p>Kann mir das mal bitte einer erklären?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/177306/destruktor-in-abstrakter-basisklasse-nötig</link><generator>RSS for Node</generator><lastBuildDate>Sun, 20 Sep 2026 00:06:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/177306.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 30 Mar 2007 06:30:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Destruktor in abstrakter Basisklasse nötig? on Fri, 30 Mar 2007 07:11:26 GMT]]></title><description><![CDATA[<p>Hallo mal wieder.</p>
<p>Ich hab hier eine abstrakte Basisklasse (quasi ein C++ - Interface <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> ), um halt ein paar Funktionen für die ableitenden Klassen zu erzwingen.</p>
<p>Ich poste einfach mal den Code:</p>
<pre><code class="language-cpp">class IBase
{
    virtual doThis() = 0;
    virtual doThat() = 0;
};

class A: public IBase
{
    A();
    virtual ~A();
    virtual doThis();
    virtual doThat();
};

class B: public IBase
{
    B();
    virtual ~B();
    virtual doThis();
    virtual doThat();
};
</code></pre>
<p>Nun instanziiere ich nur eine dieser abgeleiteten Klassen, weil jede eine Spezialisierung ist und ich eben nur eine bestimmte haben will. Daher muss ich für die Instanz einen Pointer der Basisklasse nutzen.</p>
<pre><code class="language-cpp">IBase* pInstance;
switch(condition)
{
case 1: pInstance = new A();
        break;
case 2: pInstance = new B();
        break;
default:pInstance = NULL;
}
</code></pre>
<p>Nun meine Frage: Eigentlich brauch ich doch immer einen virtuellen Destruktor in der Basisklasse, wenn ich ein davon abgeleitetes Objekt zerstören will mittels</p>
<pre><code class="language-cpp">delete pInstance;
</code></pre>
<p>Wieso brauch ich das hier nicht? Zumindest meckern weder Compiler noch Linker rum. Und wenn ich einen virtuellen Destruktor in IBase einfügen will, dann meckert der Linker rum, obwohl der Destruktor in den Klassen A und B implementiert wurde...</p>
<p>Kann mir das mal bitte einer erklären?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1255742</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1255742</guid><dc:creator><![CDATA[Knaecke]]></dc:creator><pubDate>Fri, 30 Mar 2007 07:11:26 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor in abstrakter Basisklasse nötig? on Fri, 30 Mar 2007 06:48:33 GMT]]></title><description><![CDATA[<p>Wenn die Basisklasse keinen virtuellen Destruktor hat, wird automatisch ein &quot;normaler&quot; Dtor angelegt - ergo sind Compiler und Linker glücklich, aber du vermutlich nicht (spätestens beim <code>delete pInstance;</code> wirst du sehen, was ich meine ;)). Wenn du der Basisklasse einen virtuellen Dtor spendierst, lebst du generell gesünder - aber du mußt dem Destruktor auch einen Rumpf verpassen (selbst wenn er abstrakt sein sollte):</p>
<pre><code class="language-cpp">class IBase
{
    virtual doThis() = 0;
    virtual doThat() = 0;
    virtual ~IBase() {};
};
...
</code></pre>
<p>(so sind wirklich alle rundum zufrieden :D)</p>
<p>PS: Ich hoffe, die fehlenden ; hinter den Klassendefinitionen sind ein C&amp;P-Fehler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1255752</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1255752</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 30 Mar 2007 06:48:33 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor in abstrakter Basisklasse nötig? on Fri, 30 Mar 2007 07:12:11 GMT]]></title><description><![CDATA[<p>Ah ja... 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>
<p>Ich hatte</p>
<pre><code class="language-cpp">virtual ~IBase()=0;
</code></pre>
<p>und</p>
<pre><code class="language-cpp">virtual ~IBase();
</code></pre>
<p>probiert, aber das ging halt beides nicht (Linkerfehler). Beim zweiten kann ich mir das ja auch noch erklären ohne Rumpf und wegen dem ersten: Ich glaub ich hab mal irgendwo gelesen, dass es keine abstrakten Destruktoren gäbe... dann wundert mich das auch nicht wirklich.</p>
<p>Aber kann man da jetzt trotzdem noch von einer abstrakten Klasse oder sogar im theoretischen Sinne von einem Interface sprechen? Eigentlich ja oder? Falls ich das mal jemand erklären soll, warum und wieso ich das gemacht hab... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>EDIT: Ich hab mal die ; an die Klassen rangehängt, war ein grober Schusselfehler *schäm*, kein C&amp;P <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> Hab ja alles nur so aus der Hand hingeschrieben...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1255764</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1255764</guid><dc:creator><![CDATA[Knaecke]]></dc:creator><pubDate>Fri, 30 Mar 2007 07:12:11 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor in abstrakter Basisklasse nötig? on Fri, 30 Mar 2007 08:09:20 GMT]]></title><description><![CDATA[<p>Eine Klasse ist akstrakt, sobald sie mindestens eine akstrakte Methode hat <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Und ja, es gibt sogar abstakte Destruktoren, aber wie gesagt mußt du denen trotzdem einen Rumpf spendieren:</p>
<pre><code class="language-cpp">class IBase
{
public:
  ...
  virtual ~IBase() = 0;
};

IBase::~IBase() {}
</code></pre>
<p>(der Grund ist ganz einfach der, daß die Dtoren der abgeleiteten Klassen auf jeden Fall den Basis-Dtor benötigen, um ausgeführt werden zu können.)</p>
<p>PS: So ein Konstrukt (akstrakte Methode MIT Methodenrumpf) klappt sogar mit beliebigen Methoden <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> Diese Methode kannst du dann von der abgeleiteten Klasse aus explizit aufrufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1255766</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1255766</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 30 Mar 2007 08:09:20 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor in abstrakter Basisklasse nötig? on Fri, 30 Mar 2007 07:50:28 GMT]]></title><description><![CDATA[<p>Ach Mist... noch ein Schusselfehler... war irgendwie gerade der Meinung, dass es sich nur um eine abstrakte Klasse handelt, wenn ALLE Methoden abstrakt sind... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<blockquote>
<p>(der Grund ist ganz einfach der, daß die Dtoren der abgeleiteten Klassen auf jeden Fall den Basis-Dtor benötigen, um ausgeführt werden zu können.)</p>
</blockquote>
<p>Das war mir ja klar, daher ja auch dieser Thread, denn ich konnte mir nicht so recht vorstellen, dass das der Standarddestruktor der Basisklasse übernimmt und ich wollte ja gerne Speicherlöcher vermeiden.</p>
<p>Nun geht's aber auf alle Fälle. Nur kann ich nicht wirklich von einem Interface reden, da ich ja bereits eine Instanz vom Typen IBase halte, was ja bei reinen Interfaces nicht passieren dürfte oder? Aber bitte bitte jetzt keine Diskussion anfangen, dass es keine Interfaces bei C++ gibt *liebguck*, der &quot;Entwurf Interface&quot; geht ja eigentlich doch zu implementieren...</p>
<p>PS:</p>
<pre><code class="language-cpp">IBase::~IBase[] {}
</code></pre>
<p>Da haste aber nun auch geschusselt, du meinst doch bestimmt runde anstatt eckiger Klammern? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> Wird wohl für alle Zeit für's Wochenende <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="🙂"
    /> Oder kenn ich da mal wieder irgendwas so gar nicht? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1255789</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1255789</guid><dc:creator><![CDATA[Knaecke]]></dc:creator><pubDate>Fri, 30 Mar 2007 07:50:28 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor in abstrakter Basisklasse nötig? on Fri, 30 Mar 2007 08:09:04 GMT]]></title><description><![CDATA[<p>Knaecke schrieb:</p>
<blockquote>
<blockquote>
<p>(der Grund ist ganz einfach der, daß die Dtoren der abgeleiteten Klassen auf jeden Fall den Basis-Dtor benötigen, um ausgeführt werden zu können.)</p>
</blockquote>
<p>Das war mir ja klar, daher ja auch dieser Thread, denn ich konnte mir nicht so recht vorstellen, dass das der Standarddestruktor der Basisklasse übernimmt und ich wollte ja gerne Speicherlöcher vermeiden.</p>
<p>Nun geht's aber auf alle Fälle. Nur kann ich nicht wirklich von einem Interface reden, da ich ja bereits eine Instanz vom Typen IBase halte, was ja bei reinen Interfaces nicht passieren dürfte oder? Aber bitte bitte jetzt keine Diskussion anfangen, dass es keine Interfaces bei C++ gibt *liebguck*, der &quot;Entwurf Interface&quot; geht ja eigentlich doch zu implementieren...</p>
</blockquote>
<p>Nein, du hast keine Instanz von IBase - du hast einen &quot;Zeiger auf IBase&quot; und der zeigt zur Laufzeit auf eine Instanz von A oder B (oder eine andere Klasse, die &quot;das Interface IBase implementiert&quot; hat).</p>
<blockquote>
<p>PS:</p>
<pre><code class="language-cpp">IBase::~IBase[] {}
</code></pre>
<p>Da haste aber nun auch geschusselt, du meinst doch bestimmt runde anstatt eckiger Klammern? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> Wird wohl für alle Zeit für's Wochenende :)Oder kenn ich da mal wieder irgendwas so gar nicht? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
</blockquote>
<p>Ne, das war Absicht. Ich wollte sehen, ob du noch bei der Sache bist <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1255802</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1255802</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 30 Mar 2007 08:09:04 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor in abstrakter Basisklasse nötig? on Fri, 30 Mar 2007 08:14:49 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>...<br />
PS: So ein Konstrukt (akstrakte Methode MIT Methodenrumpf) klappt sogar mit beliebigen Methoden ...</p>
</blockquote>
<p>Was aber an der &quot;Abstraktheit&quot; der Klasse nichts ändert - sie ist weiterhin nicht direkt instantiierbar. (War mal ein Mißverständnis von mir)</p>
<p>Eine Frage habe ich doch noch (Neugier): Als &quot;Basisklassenteil einer abgeleiteten Klasse&quot; ist die abstrakte Klasse ja (implizit) trotzdem instantiiert, oder ? Wird während der Konstruktion (vor dem Aufruf des BasisklasseCtors) eigentlich in die vtable etwas eingetragen, oder bedeutet das &quot;=0&quot; eben, dass hier NICHTs eingetragen wird ?<br />
Ich hatte das so verstanden, dass beim Ableiten vor Ausführen des &quot;BasisklassenCtor-Rumpfes&quot; die vtable angelegt und die (virtuellen) Basisklassenfunktionen dort eingetragen (und vor Ausführen des &quot;KindklassenCtor-Rumpfes&quot; von deren v-Funktionen überschrieben) werden.<br />
Ist das richtig ? Oder total implementationsabhängig ?</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1255805</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1255805</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Fri, 30 Mar 2007 08:14:49 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor in abstrakter Basisklasse nötig? on Fri, 30 Mar 2007 08:27:41 GMT]]></title><description><![CDATA[<p>Ich hätte auch gedacht, dass trotzdem irgendwie eine Instanz der Basisklasse angelegt wird, denn wenn ich schon einen Methodenrumpf hab, dann muss der doch auch irgendwie für eine Abarbeitung existieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1255812</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1255812</guid><dc:creator><![CDATA[Knaecke]]></dc:creator><pubDate>Fri, 30 Mar 2007 08:27:41 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor in abstrakter Basisklasse nötig? on Fri, 30 Mar 2007 08:34:38 GMT]]></title><description><![CDATA[<p>Knaecke schrieb:</p>
<blockquote>
<p>Ich hätte auch gedacht, dass trotzdem irgendwie eine Instanz der Basisklasse angelegt wird, denn wenn ich schon einen Methodenrumpf hab, dann muss der doch auch irgendwie für eine Abarbeitung existieren?</p>
</blockquote>
<p>Methoden existieren einmal pro Klasse und können von allen Instanzen genutzt werden. Eine Instanz wird erst erzeugt, wenn du sie selber anlegst.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/734">@Simon</a>: Afaik ist es komplett dem Compiler überlassen, wie er virtuelle Funktionen implementiert (aber eine vtable) ist wohl der gängigste Weg. Von daher ist erst recht nicht festgelegt, wie er abstrakte Methoden (mit oder ohne Methodenrumpf) behandelt. Und die Bedingung &quot;alle abstrakten Methoden müssen überschrieben werden&quot; dürften normale Compiler bereits auf syntaktischer Ebene kontrollieren, ohne die vtable zu bemühen.</p>
<p>(auch wenn das &quot;=0;&quot; sehr an eine Zuweisung erinnert, ist nicht einmal geagt, daß in der vtable wirklich NULL-Einträge landen)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1255817</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1255817</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 30 Mar 2007 08:34:38 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor in abstrakter Basisklasse nötig? on Fri, 30 Mar 2007 08:40:17 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Knaecke schrieb:</p>
<blockquote>
<p>Ich hätte auch gedacht, dass trotzdem irgendwie eine Instanz der Basisklasse angelegt wird, denn wenn ich schon einen Methodenrumpf hab, dann muss der doch auch irgendwie für eine Abarbeitung existieren?</p>
</blockquote>
<p>Methoden existieren einmal pro Klasse und können von allen Instanzen genutzt werden. Eine Instanz wird erst erzeugt, wenn du sie selber anlegst.</p>
</blockquote>
<p>Hm stimmt... Ist ja nix anderes, als wenn ich von einer normalen Klasse erbe, dann kann ich deren Methoden ja genauso verwenden... ich sollte echt mehr überlegen bevor ich was schreibe heute... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>Na gut, aber trotzdem wieder was dazugelernt mit dem Destruktor <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="🙂"
    /> Dankeschön <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1255819</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1255819</guid><dc:creator><![CDATA[Knaecke]]></dc:creator><pubDate>Fri, 30 Mar 2007 08:40:17 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor in abstrakter Basisklasse nötig? on Fri, 30 Mar 2007 08:49:13 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>...<br />
<a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/734">@Simon</a>: ...</p>
</blockquote>
<p>Aha !!</p>
<p>Danke,</p>
<p>Simon2.</p>
<p>P.S.: Ich hatte noch nie &quot;=0&quot; mit einer Zuweisung verwechselt ... aber ich denke, es soll trotzdem an eine erinnern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1255824</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1255824</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Fri, 30 Mar 2007 08:49:13 GMT</pubDate></item></channel></rss>