<?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[Vererbung - virtual]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich komme immer wieder damit durcheinander. Wann und wo verwendet man virtual?<br />
Ich weiß - laut Scott Myers - man *muss immer* Basisklassen einen virtuellen Destruktor verpassen.</p>
<p>Aber wann und wo sollten Methoden virtuell sein?</p>
<pre><code class="language-cpp">class Base
{
private:

    int m_int;

public:

    Base()
    virtual ~Base()

protected:

    // Diese Methode soll später in einer abgeleiteten Klasse überschrieben werden können, muss aber nicht
    int Foo (int n);

   // Diese Methode soll nicht überschrieben werden können
   void Foo1 (void);
};

class TheClass : public Base
{
    // Code
};
</code></pre>
<p>Braucht hier auch die Klasse &quot;TheClass&quot; einen virtuellen Destruktor?<br />
Muss die Methode Foo, die nach Bedarf überschrieben werden darf in der Basisklasse schon als virtuell definiert werden oder erst in der abgeleiteten Klasse?</p>
<p>Gruß Tim</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/199714/vererbung-virtual</link><generator>RSS for Node</generator><lastBuildDate>Sat, 03 Oct 2026 19:18:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/199714.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 06 Dec 2007 12:56:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vererbung - virtual on Thu, 06 Dec 2007 12:56:03 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich komme immer wieder damit durcheinander. Wann und wo verwendet man virtual?<br />
Ich weiß - laut Scott Myers - man *muss immer* Basisklassen einen virtuellen Destruktor verpassen.</p>
<p>Aber wann und wo sollten Methoden virtuell sein?</p>
<pre><code class="language-cpp">class Base
{
private:

    int m_int;

public:

    Base()
    virtual ~Base()

protected:

    // Diese Methode soll später in einer abgeleiteten Klasse überschrieben werden können, muss aber nicht
    int Foo (int n);

   // Diese Methode soll nicht überschrieben werden können
   void Foo1 (void);
};

class TheClass : public Base
{
    // Code
};
</code></pre>
<p>Braucht hier auch die Klasse &quot;TheClass&quot; einen virtuellen Destruktor?<br />
Muss die Methode Foo, die nach Bedarf überschrieben werden darf in der Basisklasse schon als virtuell definiert werden oder erst in der abgeleiteten Klasse?</p>
<p>Gruß Tim</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1415812</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1415812</guid><dc:creator><![CDATA[gast1]]></dc:creator><pubDate>Thu, 06 Dec 2007 12:56:03 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung - virtual on Thu, 06 Dec 2007 13:00:07 GMT]]></title><description><![CDATA[<p>Immer dann, wenn eine Methode überschreibbar sein soll, mußt du virtual hinschreiben.<br />
In deinem Beispiel ist Foo virtual.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1415814</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1415814</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Thu, 06 Dec 2007 13:00:07 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung - virtual on Thu, 06 Dec 2007 13:01:51 GMT]]></title><description><![CDATA[<p>Wenn du vorhast, die Funktion irgendwann in einer abgeleiteten Klasse überschreiben zu wollen, mußt du sie virtuell definieren (das betrifft auch Foo1(). Andernfalls bekommst du Probleme mit der Typ-Auflösung (statischer Typ vs. dynamischer Typ).</p>
<p>Und daß <em>jede</em> Basisklasse einen virtuellen Destruktor benötigt, ist übertrieben - den brauchst du nur, wenn du Polymorphie mit Heap-Verwaltung kombinieren willst (ja, das trifft nahezu immer zu - aber der Unterschied ist wichtig ;))</p>
<p>PS: Ob du der abgeleiteten Klasse einen virtuellen Destruktor verpasst, ist egal - der wird automatisch virtuell, weil er in der Basis auch schon virtuell definiert wurde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1415816</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1415816</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 06 Dec 2007 13:01:51 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung - virtual on Thu, 06 Dec 2007 13:08:19 GMT]]></title><description><![CDATA[<p>Gut, also alles was überschrieben werden soll, muss bereits in der Basisklasse als virtuell deklariert werden, richtig?</p>
<p>Danke, Tim.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1415824</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1415824</guid><dc:creator><![CDATA[gast1]]></dc:creator><pubDate>Thu, 06 Dec 2007 13:08:19 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung - virtual on Thu, 06 Dec 2007 13:33:34 GMT]]></title><description><![CDATA[<blockquote>
<p>Gut, also alles was überschrieben werden soll</p>
</blockquote>
<p>Na, &quot;soll&quot; nicht gerade. &quot;kann&quot; wäre richtig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1415849</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1415849</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Thu, 06 Dec 2007 13:33:34 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung - virtual on Thu, 06 Dec 2007 13:38:56 GMT]]></title><description><![CDATA[<p>gast1 schrieb:</p>
<blockquote>
<p>Gut, also alles was überschrieben werden soll, muss bereits in der Basisklasse als virtuell deklariert werden, richtig?</p>
</blockquote>
<p>Ein wenig ausführlicher:</p>
<p>Erstmal eine grobe Klassenstruktur</p>
<pre><code class="language-cpp">class Base{...};
class Class1 : public Base{...};
</code></pre>
<p><strong>Thema: Destruktor</strong></p>
<pre><code class="language-cpp">int main()
{
  Base* obj = new Class1();
  delete obj;
}
</code></pre>
<p><em>Variante a: Base hat keinen virtuellen Destruktor</em><br />
Nun wird der Destruktor von Base aufgerufen, nicht aber der, der abgeleiteten Klassen. Dies kann (muss aber nicht) zu Speicherleaks führen.</p>
<p><em>Variante b: Base hat einen virtuellen Destruktor</em><br />
Nun wird beim Destruktoraufruf sicher gestellt das alle Destruktoren des Objektes aufgerufen werden (von der untersten Klasse in Richtung Basisklasse).</p>
<p><em>Anmerkung:</em> Ich würde daher mich an Scott Mayers Rat halten. Den selbst wenn anfangs der virtuelle Destruktor nicht nötig sein sollte, kann eine Änderung an einer abgeleiteten Klasse dies bereits wieder ändern.</p>
<p><strong>Thema: Virtuelle Funktionen</strong><br />
Nehmen wir einfach mal an wir haben in jeder der Klassen eine Methode foo mit der gleichen Signatur. z.B. void foo();</p>
<pre><code class="language-cpp">int main()
{
  Base* obj = new Class1();
  obj-&gt;foo();
  delete obj;
}
</code></pre>
<p><em>Variante a: Base hat foo nicht virtuell deklariert</em><br />
Bei dem Aufruf wird Base::foo() aufgerufen</p>
<p><em>Variante b: Base hat foo virtuell deklariert</em><br />
Bei dem Aufruf wird Class1::foo() aufgerufen</p>
<p><em>Anmerkung:</em> Du musst dir hier einfach überlegen welche Funktionalität du erreichen willst, in der Regel ist es so das wenn eine Funktion überschreibbar sein sollte, diese auch virtuell deklariert sein muss.</p>
<p><strong>Rein virtuelle Basisklasse</strong><br />
Von dir nicht erwähnt, ergänze ich dieses Thema aber dennoch der vollständigkeit halber. Wenn du eine Basisklasse hast, die nicht direkt benutzt werden soll, sondern wo man immer die abgeleiteten Klassen nutzen soll, musst du in der Basisklasse mindestens eine Methode rein virtuelle deklarieren. Diese Methode braucht dann auch nicht in der Basisklasse implementiert zu sein.</p>
<p>Beispielsweise könnte man z.B. eine Basisklasse &quot;Grafikobjekt&quot; haben die eine rein virtuelle Methode &quot;zeichen&quot; hat (den wie etwas gezeichnet wird, ist wohl dem konkreten Grafikobjekt z.B. einem Rechteck bekannt, nicht aber einer abstrakten Klasse):</p>
<pre><code class="language-cpp">class Grafikobjekt
{
  public:
    virtual void zeichne() = 0; // &quot;pure virtual&quot;
  ...
};
</code></pre>
<p>Nun kannst du keine Objekte des Typs Grafikobjekt direkt erzeigen, kannst aber weiterhin über den Zeiger auf abgeleitete Klassen zugreifen (sofern diese alle rein virtuellen Methoden überschrieben haben).</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1415858</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1415858</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 06 Dec 2007 13:38:56 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung - virtual on Thu, 06 Dec 2007 13:50:24 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p><em>Variante a: Base hat keinen virtuellen Destruktor</em><br />
Nun wird der Destruktor von Base aufgerufen, nicht aber der, der abgeleiteten Klassen. Dies kann (muss aber nicht) zu Speicherleaks führen.</p>
</blockquote>
<p>Nicht ganz - was hier passiert, ist technisch undefiniert, auch wenn die meisten Lösungen darauf hinauslaufen werden, daß nur der Basis-Dtor ausgeführt wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1415866</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1415866</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 06 Dec 2007 13:50:24 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung - virtual on Thu, 06 Dec 2007 14:19:35 GMT]]></title><description><![CDATA[<p>Destruktoren für Basis Klassen:</p>
<p>Entweder public virtual oder protected non- virtual (Herb Sutter in einem seiner Bücher...).</p>
<p>Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1415896</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1415896</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Thu, 06 Dec 2007 14:19:35 GMT</pubDate></item></channel></rss>