<?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: Basisklasse soll neu definierte Methode auch intern verwenden]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich entschuldige mich schon einmal im Voraus, meine Frage wurde bestimmt schon des öfteren beantwortet - leider weiß ich nicht, wonach ich suchen muss. Bitte sagt mir auch, wenn ich die C++ Terminologie nicht korrekt verwende.</p>
<p>Ich habe eine Klasse geschrieben, die mir als Vorlage für Animationen dienen soll. Sie sieht ungefähr so aus:</p>
<pre><code class="language-cpp">class animationwindow
{
  //...
  public:
    //...
    void handleEvents(){/*handle nichts*/};
    void repaint(){/*zeichne nichts*/};
    void mainloop(){
      while(1)
      {
        handleEvents();
        repaint();
      }
    };
};
</code></pre>
<p>Die Methoden &quot;handleEvents&quot; und &quot;repaint&quot; sollen dann in der tatsächlichen Animation neu definiert werden.</p>
<p>Nun definiere ich folgende Animation, die von &quot;animationwindow&quot; erbt und die &quot;repaint&quot; Methode überschreiben soll:</p>
<pre><code class="language-cpp">class anim : public animationwindow
{
  //...
  public:
  //...
    void repaint() const {
      //zeichne einen frame der animation
    };
};
</code></pre>
<p>Wenn ich dann allerdings im Hauptprogramm die geerbte Methode &quot;mainloop()&quot; der Klasse &quot;anim&quot; aufrufe, wird die &quot;repaint&quot; Methode der Basisklasse verwendet und nicht die neu definierte. Ich habe schon viel mit virtual, const, etc. herumgespielt, verstehe aber offensichtlich noch nicht genug davon. Wenn ich die Inhalte der &quot;mainloop()&quot; Methode explizit im Hauptprogramm implementiere, funktioniert es wie es soll, ich hätte aber gern eine extra Methode dafür.</p>
<p><strong>Wie kann ich also der Basisklasse klarmachen, dass sie auch intern die neu definierte Methode der abgeleiteten Klasse verwenden soll?</strong></p>
<p>Ich würde mich freuen, wenn mir jemand einen kleinen Wink in die richtige Richtung geben könnte, mir sagt, wonach ich suchen sollte oder mir sogar einen richtiggestellten Beispielcode posten könnte - Sofern das was ich da mache überhaupt sinnvoll ist. Alternativlösungen sind auch herzlich willkommen.</p>
<p>Vielen Dank schon mal.</p>
<p>Mit besten Grüßen,<br />
Stefan</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/206699/vererbung-basisklasse-soll-neu-definierte-methode-auch-intern-verwenden</link><generator>RSS for Node</generator><lastBuildDate>Sat, 10 Oct 2026 14:52:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/206699.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 27 Feb 2008 17:31:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vererbung: Basisklasse soll neu definierte Methode auch intern verwenden on Wed, 27 Feb 2008 17:32:35 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich entschuldige mich schon einmal im Voraus, meine Frage wurde bestimmt schon des öfteren beantwortet - leider weiß ich nicht, wonach ich suchen muss. Bitte sagt mir auch, wenn ich die C++ Terminologie nicht korrekt verwende.</p>
<p>Ich habe eine Klasse geschrieben, die mir als Vorlage für Animationen dienen soll. Sie sieht ungefähr so aus:</p>
<pre><code class="language-cpp">class animationwindow
{
  //...
  public:
    //...
    void handleEvents(){/*handle nichts*/};
    void repaint(){/*zeichne nichts*/};
    void mainloop(){
      while(1)
      {
        handleEvents();
        repaint();
      }
    };
};
</code></pre>
<p>Die Methoden &quot;handleEvents&quot; und &quot;repaint&quot; sollen dann in der tatsächlichen Animation neu definiert werden.</p>
<p>Nun definiere ich folgende Animation, die von &quot;animationwindow&quot; erbt und die &quot;repaint&quot; Methode überschreiben soll:</p>
<pre><code class="language-cpp">class anim : public animationwindow
{
  //...
  public:
  //...
    void repaint() const {
      //zeichne einen frame der animation
    };
};
</code></pre>
<p>Wenn ich dann allerdings im Hauptprogramm die geerbte Methode &quot;mainloop()&quot; der Klasse &quot;anim&quot; aufrufe, wird die &quot;repaint&quot; Methode der Basisklasse verwendet und nicht die neu definierte. Ich habe schon viel mit virtual, const, etc. herumgespielt, verstehe aber offensichtlich noch nicht genug davon. Wenn ich die Inhalte der &quot;mainloop()&quot; Methode explizit im Hauptprogramm implementiere, funktioniert es wie es soll, ich hätte aber gern eine extra Methode dafür.</p>
<p><strong>Wie kann ich also der Basisklasse klarmachen, dass sie auch intern die neu definierte Methode der abgeleiteten Klasse verwenden soll?</strong></p>
<p>Ich würde mich freuen, wenn mir jemand einen kleinen Wink in die richtige Richtung geben könnte, mir sagt, wonach ich suchen sollte oder mir sogar einen richtiggestellten Beispielcode posten könnte - Sofern das was ich da mache überhaupt sinnvoll ist. Alternativlösungen sind auch herzlich willkommen.</p>
<p>Vielen Dank schon mal.</p>
<p>Mit besten Grüßen,<br />
Stefan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1464237</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1464237</guid><dc:creator><![CDATA[stfn]]></dc:creator><pubDate>Wed, 27 Feb 2008 17:32:35 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung: Basisklasse soll neu definierte Methode auch intern verwenden on Wed, 27 Feb 2008 18:16:46 GMT]]></title><description><![CDATA[<p>stfn schrieb:</p>
<blockquote>
<p>...<strong>Wie kann ich also der Basisklasse klarmachen, dass sie auch intern die neu definierte Methode der abgeleiteten Klasse verwenden soll?</strong>...</p>
</blockquote>
<p>Das Schlüsselwort virtual ist dein Freund.<br />
Und wenn dein &quot;animationwindow&quot; nur als Basisklasse dienen soll, ohne direkt verwendet werden zu können, dann kannst du die Methoden auch als sogenanntes &quot;pure virtual&quot; [Schreibweise später im Text] deklarieren (Dies entspricht in anderen Sprachen dem &quot;Interface&quot;). Alle Klassen die als Basisklasse dienen sollten zudem im Regelfall einen virtuellen Destruktor verwenden.</p>
<p>Kurzes Beispiel und Schreibweise:</p>
<pre><code class="language-cpp">class Basis
{
  public:
    int foo1();         // Normale Methode
    virtual foo2();     // Virtuelle Methode
    virtual foo3() = 0; // Pure-Virtuelle Methode

    virtual ~Basis();   // Bei Basisklassen im Regelfall immer virtueller Destruktor!
}
</code></pre>
<p>Pur-Virtuelle Methoden haben keine Definition, sobald eine pure virtuelle Methode verwendet wird, kann keine Instanz der Klasse selbst erzeugt werden (Wohl aber kann man weiterhin die Zeiger der Basisklasse zum Verwalten von den konkret davon abgeleiteten verwenden. Falls man keine pur virtuelle Methode hat, aber eben dieses Verhalten erzwingen möchte, so kann man den Destruktor als pure virtuell deklarieren: hier ist aber die Deklaration egal wie zu machen (also mindestens {} ).</p>
<p>&quot;virtual&quot; wird mitvererbt. Sprich: In einer Basisklasse für eine Methode gesetzt gilt dies auch für die abgeleiten Klassen, auch wenn dort virtual nicht mehr erwähnt wird.</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1464266</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1464266</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Wed, 27 Feb 2008 18:16:46 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung: Basisklasse soll neu definierte Methode auch intern verwenden on Thu, 28 Feb 2008 08:33:08 GMT]]></title><description><![CDATA[<p>Super, hat geklappt. 10<sup>3</sup> Dank.</p>
<p>Das Schlüsselwort &quot;virtual&quot; und das Weglassen des Schlüsselwortes &quot;const&quot; hinter &quot;anim::repaint()&quot; machten den Unterschied.</p>
<p>Stefan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1464541</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1464541</guid><dc:creator><![CDATA[stfn]]></dc:creator><pubDate>Thu, 28 Feb 2008 08:33:08 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung: Basisklasse soll neu definierte Methode auch intern verwenden on Thu, 28 Feb 2008 09:10:49 GMT]]></title><description><![CDATA[<p>stfn schrieb:</p>
<blockquote>
<p>Super, hat geklappt. 10<sup>3</sup> Dank.</p>
<p>Das Schlüsselwort &quot;virtual&quot; und das Weglassen des Schlüsselwortes &quot;const&quot; hinter &quot;anim::repaint()&quot; machten den Unterschied.</p>
</blockquote>
<p>Das const hinter einer Funktion ist schon richtig, sofern diese Funktion nichts am Objektzustand ändert. Das hat mit dem virtual nichts zu tun, nur habe ich mich hier der Einfachheit halber nur um die virtual-Beschreibung gekümmert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1464561</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1464561</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 28 Feb 2008 09:10:49 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung: Basisklasse soll neu definierte Methode auch intern verwenden on Thu, 28 Feb 2008 11:50:17 GMT]]></title><description><![CDATA[<p>Nachdem ich die entsprechenden Methoden &quot;virtual&quot; gesetzt hatte, blieb das Problem weiterhin bestehen. Erst als ich das &quot;const&quot; weggelassen habe, hat das Programm gemacht was ich wollte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1464656</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1464656</guid><dc:creator><![CDATA[stfn]]></dc:creator><pubDate>Thu, 28 Feb 2008 11:50:17 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung: Basisklasse soll neu definierte Methode auch intern verwenden on Thu, 28 Feb 2008 11:53:12 GMT]]></title><description><![CDATA[<p>stfn schrieb:</p>
<blockquote>
<p>Nachdem ich die entsprechenden Methoden &quot;virtual&quot; gesetzt hatte, blieb das Problem weiterhin bestehen. Erst als ich das &quot;const&quot; weggelassen habe, hat das Programm gemacht was ich wollte.</p>
</blockquote>
<p>Dann hattest Du vermutlich in der Basisklasse const und in der abgeleiteten nicht, oder umgekehrt. Denn dann hast Du nicht eine virtuell überschriebene Funktion, sondern zwei völlig voneinander unabhängige.</p>
<p>Also: Mit const in <strong>beiden</strong> Klassen solltest Du kein Problem haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1464660</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1464660</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 28 Feb 2008 11:53:12 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung: Basisklasse soll neu definierte Methode auch intern verwenden on Thu, 28 Feb 2008 11:53:51 GMT]]></title><description><![CDATA[<p>Das liegt einfach daran, dass die Funktion der Basisklasse nicht const ist. Somit hat die const-Variante in der abgeleiteten Klasse eine neue Methode implementiert, da ja const zum Namen der Methode gehört. Nur wenn <strong>beide</strong> const oder nicht const sind funktioniert es mit virtual wie gewollt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1464661</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1464661</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 28 Feb 2008 11:53:51 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung: Basisklasse soll neu definierte Methode auch intern verwenden on Thu, 28 Feb 2008 11:57:24 GMT]]></title><description><![CDATA[<p>stfn schrieb:</p>
<blockquote>
<p>das Weglassen des Schlüsselwortes &quot;const&quot; hinter &quot;anim::repaint()&quot; machten den Unterschied.</p>
</blockquote>
<p><code>anim::repaint() const</code> und <code>anim::repaint()</code> sind zwei verschiedene methoden. wenn du in der basisklasse repaint als const deklarierst, dann hast du auch kein problem damit, die funktion in der abgeleiteten klasse zu überschreiben. die methode, die du überschreiben willst, muss dieselbe signatur haben wie die methode in der basisklasse.*<br />
du wunderst dich ja schließlich auch nicht darüber:</p>
<pre><code class="language-cpp">class Base
{
public: virtual void foo (int) {}
};

class Derived : Base
{
   virtual void foo (double) {}
};

Base* b = new Derived;
b-&gt;foo(42);
</code></pre>
<p>b-&gt;foo ruft natürlich nicht Derived::foo(double) auf.<br />
das einzige, was in der abgeleiteten klasse hier passiert, ist das Base::foo verdeckt wird.</p>
<p>*(nur kovariante rückgabetypen sind erlaubt)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1464665</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1464665</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Thu, 28 Feb 2008 11:57:24 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung: Basisklasse soll neu definierte Methode auch intern verwenden on Thu, 28 Feb 2008 13:42:55 GMT]]></title><description><![CDATA[<p>Alles klar, ich verstehe. Nochmals vielen Dank für die zahlreichen Antworten. Ich schau bestimmt bald mal wieder vorbei.</p>
<p>Stefan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1464749</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1464749</guid><dc:creator><![CDATA[stfn]]></dc:creator><pubDate>Thu, 28 Feb 2008 13:42:55 GMT</pubDate></item></channel></rss>