<?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[Problem mit Vererbung abstrakter Methode]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich versuche gerade das Entwurfsmuster &quot;Strategie&quot; in C++ zu implementieren. Ich tat dies bereits mehrere Mal in Java und stehe gerade vor einem doofen Problem. Hier ist mein Code:</p>
<pre><code class="language-cpp">class scheduler {

	protected:
		virtual void scheduleAlgorithm() = 0; //eine abstrakte Methode, die erst in eine Kindklasse implementiert werden soll
		//...

	public:
		/...		

};
//...
class fifo : public scheduler{

	public: 	
		fifo(std::vector&lt;process&gt;);
};

//...
void fifo::scheduleAlgorithm() { //unbekannt -&gt; Fehler

}
</code></pre>
<p>Warum kann ich nun die Methode &quot;scheduleAlgorithm&quot; nicht implementieren?<br />
‘void fifo::scheduleAlgorithm()’ member function declared in class ‘fifo’</p>
<p>fifo erbt doch von scheduler. Was mache ich in C++ falsch?</p>
<p>Vielen Dank<br />
LG, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/313500/problem-mit-vererbung-abstrakter-methode</link><generator>RSS for Node</generator><lastBuildDate>Sun, 02 Aug 2026 07:26:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/313500.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 01 Feb 2013 18:57:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Vererbung abstrakter Methode on Fri, 01 Feb 2013 18:57:44 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich versuche gerade das Entwurfsmuster &quot;Strategie&quot; in C++ zu implementieren. Ich tat dies bereits mehrere Mal in Java und stehe gerade vor einem doofen Problem. Hier ist mein Code:</p>
<pre><code class="language-cpp">class scheduler {

	protected:
		virtual void scheduleAlgorithm() = 0; //eine abstrakte Methode, die erst in eine Kindklasse implementiert werden soll
		//...

	public:
		/...		

};
//...
class fifo : public scheduler{

	public: 	
		fifo(std::vector&lt;process&gt;);
};

//...
void fifo::scheduleAlgorithm() { //unbekannt -&gt; Fehler

}
</code></pre>
<p>Warum kann ich nun die Methode &quot;scheduleAlgorithm&quot; nicht implementieren?<br />
‘void fifo::scheduleAlgorithm()’ member function declared in class ‘fifo’</p>
<p>fifo erbt doch von scheduler. Was mache ich in C++ falsch?</p>
<p>Vielen Dank<br />
LG, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2295446</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2295446</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Fri, 01 Feb 2013 18:57:44 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Vererbung abstrakter Methode on Fri, 01 Feb 2013 19:00:34 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class scheduler {

	protected:
		virtual void scheduleAlgorithm() = 0; //eine abstrakte Methode, die erst in eine Kindklasse implementiert werden soll
		//...

	public:
		/...		

};
//...
class fifo : public scheduler{

	public: 	
		fifo(std::vector&lt;process&gt;);
                void scheduleAlgorithm();//musst sie schon deklarieren
};

//...
void fifo::scheduleAlgorithm() { //unbekannt -&gt; Fehler

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2295447</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2295447</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 01 Feb 2013 19:00:34 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Vererbung abstrakter Methode on Fri, 01 Feb 2013 19:01:34 GMT]]></title><description><![CDATA[<pre><code>class fifo : public scheduler
{
    public:    
        fifo(std::vector&lt;process&gt;);
        virtual void scheduleAlgorithm();
};
</code></pre>
<p>Eine virtuelle Funktion musst du überschreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2295448</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2295448</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Fri, 01 Feb 2013 19:01:34 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Vererbung abstrakter Methode on Fri, 01 Feb 2013 20:31:42 GMT]]></title><description><![CDATA[<p>Ah ok <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="🙂"
    /> Das wusste ich nicht. Gibt es dafür einen Grund? Immerhin erbe ich die Methode, sodass sie deklariert sein sollte. In Java ist das nicht nötig.</p>
<p>Bis jetzt funktioniert alles soweit, doch mich quält ein Segmentation Error. Könnt ihr mal drüber schauen?</p>
<pre><code class="language-cpp">class scheduler {

	protected:
		virtual void scheduleAlgorithm() = 0; //eine virtuelle Methode für die Kinder
		std::vector&lt;process&gt; processes;	

	public:
		scheduler(std::vector&lt;process&gt; p) {processes = p;}
		~scheduler(){};
		std::vector&lt;std::string&gt; schedule(int);

};

std::vector&lt;std::string&gt; scheduler::schedule(int duration) {

	std::cout &lt;&lt; &quot;MamaScheduler&quot; &lt;&lt; std::endl;
	scheduleAlgorithm(); //Aufruf der virtuellen Methode
}

class fifo : public scheduler{ //ein Kind von scheduler

	public: 	
		fifo(std::vector&lt;process&gt;);
		~fifo(){}
		void scheduleAlgorithm(); 
};

fifo::fifo(std::vector&lt;process&gt; p) : scheduler(p) {

}

void fifo::scheduleAlgorithm() {
	std::cout &lt;&lt; &quot;Fifo-Algorithmus&quot; &lt;&lt; std::endl; //die virtuelle Methode wird definiert
}
</code></pre>
<p>In der main mache ich dann folgendes:</p>
<pre><code class="language-cpp">scheduler* test = new fifo(proc); //edit: Rechtschreibfehler verbessert
vector&lt;string&gt; res = test-&gt;schedule(totalDuration); //Diese Methode verursacht den Fehler
delete test;
</code></pre>
<p>Die Ausgabe erfolg nach meinen Erwartungen, doch danach kommt es zu einem Speicherzugriffsfehler:</p>
<p>MamaScheduler<br />
Fifo-Algorithmus<br />
./run.s: line 3: 5885 Segmentation fault ./scheduler &quot;processes.txt&quot;</p>
<p>Ich arbeite mit keinen Zeigern (außer für &quot;test&quot;). Ich dachte, dass es irgendwie am Aufräumen liegt, doch den (sinnlosen) Destuktor rufe ich auf.</p>
<p>Weiß jemand weiter?</p>
<p>Vielen Dank<br />
LG, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2295464</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2295464</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Fri, 01 Feb 2013 20:31:42 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Vererbung abstrakter Methode on Fri, 01 Feb 2013 20:24:29 GMT]]></title><description><![CDATA[<p>Du musst keinen Destruktor aufrufen, das wird automatisch gemacht!<br />
Da du beim Erstellen von test das Gleichheitszeichen vergessen hast, nehme ich an, dass du den Code nur &quot;grob&quot; wiedergegeben hast.<br />
Copy&amp;Paste bitte alles!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2295468</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2295468</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Fri, 01 Feb 2013 20:24:29 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Vererbung abstrakter Methode on Fri, 01 Feb 2013 20:31:05 GMT]]></title><description><![CDATA[<p>sorry, alles ist copy und paste. Nur die main habe ich abgeschrieben^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2295472</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2295472</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Fri, 01 Feb 2013 20:31:05 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Vererbung abstrakter Methode on Fri, 01 Feb 2013 20:34:55 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>sorry, alles ist copy und paste. Nur die main habe ich abgeschrieben^^</p>
</blockquote>
<p>Eventuell solltest Du die Warnstufe Deines Compilers etwas höher drehen.<br />
Funktionen, die einen Wert zurückgeben sollen und es dann doch nicht tun sind schlecht.</p>
<p>Was soll der Quatsch? ist das wirklich notwendig wegen so einem Mist (dem Segfault) zu posten, anstatt sich den Code anzuschauen?<br />
Dafür sollte Dir <strong>jeder</strong> Professor die Hammelbeine langziehen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2295473</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2295473</guid><dc:creator><![CDATA[doh!]]></dc:creator><pubDate>Fri, 01 Feb 2013 20:34:55 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Vererbung abstrakter Methode on Fri, 01 Feb 2013 20:41:39 GMT]]></title><description><![CDATA[<p>doh! schrieb:</p>
<blockquote>
<p>Eventuell solltest Du die Warnstufe Deines Compilers etwas höher drehen.</p>
</blockquote>
<p>Nicht nötig gewesen.</p>
<p>doh! schrieb:</p>
<blockquote>
<p>Funktionen, die einen Wert zurückgeben sollen und es dann doch nicht tun sind schlecht.</p>
</blockquote>
<p>In der Tat! Das war der Fehler!</p>
<p>doh! schrieb:</p>
<blockquote>
<p>Was soll der Quatsch?</p>
</blockquote>
<p>Welcher Quatsch?</p>
<p>doh! schrieb:</p>
<blockquote>
<p>ist das wirklich notwendig wegen so einem Mist (dem Segfault) zu posten, anstatt sich den Code anzuschauen?</p>
</blockquote>
<p>Da ein SegFault leider nicht sehr viel aussagt, finde ich es durchaus angebracht. Ich habe den wohl offensichtlichen Fehler einfach nicht gesehen. Da hilft es, wenn mal schnell andere drüber schauen.</p>
<p>doh! schrieb:</p>
<blockquote>
<p>Dafür sollte Dir <strong>jeder</strong> Professor die Hammelbeine langziehen!</p>
</blockquote>
<p>Falls Du dich hier auf Abschreiben des Codes beziehst, dann gebe ich dir Recht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /> .</p>
<p>Vielen Dank<br />
LG, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2295476</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2295476</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Fri, 01 Feb 2013 20:41:39 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Vererbung abstrakter Methode on Fri, 01 Feb 2013 21:32:17 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>Ah ok <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="🙂"
    /> Das wusste ich nicht. Gibt es dafür einen Grund? Immerhin erbe ich die Methode, sodass sie deklariert sein sollte. In Java ist das nicht nötig.</p>
</blockquote>
<p>C++ Code:</p>
<pre><code class="language-cpp">class Base {
public:
   virtual void foo() {}
};

class Derived : public Base {
public:
   void foo() {}
};
</code></pre>
<p>Java:</p>
<pre><code class="language-java">class Base {
  public void foo() {}
}

class Derived extends Base {
  public void foo() {}
}
</code></pre>
<p>Sieht fuer mich ziemlich identisch aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2295490</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2295490</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Fri, 01 Feb 2013 21:32:17 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Vererbung abstrakter Methode on Fri, 01 Feb 2013 23:06:53 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>Ah ok <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="🙂"
    /> Das wusste ich nicht. Gibt es dafür einen Grund?</p>
</blockquote>
<p>Ja.</p>
<p>freakC++ schrieb:</p>
<blockquote>
<p>Immerhin erbe ich die Methode, sodass sie deklariert sein sollte.</p>
</blockquote>
<p>Ja, schon irgendwie.<br />
Aber der Autor von Derived hat ein darüberhinausgehendes schutzwürdiges Interesse, nämlich, daß wenn er sie nicht in seiner Klasse deklariert, daß dann auch kein Fremder Hanselpansel irgendwann ankommen kann und sie für ihn definieren kann.</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;algorithm&gt;
using namespace std;

struct Airplane{
    virtual void fly();
};
void Airplane::fly(){
    cout&lt;&lt;&quot;flieg flieg flieg\n&quot;;
}

struct Boeing:Airplane{
    //fly not redefined, because the default implemetaition
    //is ok
};

int main(){
    Boeing b;
    b.fly();
}

////////////////////////////////////////////////////////////////////////////////
//found in boost/unstable/alquaida.hxx
void Boeing::fly(){
    Airplane::fly();
    if(clock()==9/11)
        cout&lt;&lt;&quot;crash crash crash\n&quot;;
}
</code></pre>
<p>freakC++ schrieb:</p>
<blockquote>
<p>In Java ist das nicht nötig.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2295499</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2295499</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 01 Feb 2013 23:06:53 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Vererbung abstrakter Methode on Fri, 01 Feb 2013 23:56:07 GMT]]></title><description><![CDATA[<p>In C++ benutzt man für Strategy eher <code>std::function</code> oder so. Das ist einfacher als das Gefummel mit abtrakten Klassen.</p>
<p>freakC++ schrieb:</p>
<blockquote>
<pre><code class="language-cpp">scheduler* test = new fifo(proc); //edit: Rechtschreibfehler verbessert
vector&lt;string&gt; res = test-&gt;schedule(totalDuration); //Diese Methode verursacht den Fehler
delete test;
</code></pre>
</blockquote>
<p>Das <code>delete</code> kannst du dir sparen und nie wieder benutzen. In diesem Fall kann das Beispiel ohne Speicherleck zum Beispiel so aussehen:</p>
<pre><code class="language-cpp">fifo test(proc);
vector&lt;string&gt; res = static_cast&lt;scheduler &amp;&gt;(test).schedule(totalDuration);
</code></pre>
<p>Wenn es wegen Polymorphie unbedingt <code>new</code> sein muss, verpackt man den Zeiger aus diversen Gründen in einem <code>unique_ptr</code> . Lies mal nach was RAII ist.</p>
<pre><code class="language-cpp">unique_ptr&lt;scheduler&gt; test(new fifo(proc));
test-&gt;schedule(totalDuration);
</code></pre>
<p>Hat dein <code>scheduler</code> überhaupt einen virtuellen Destruktor? Wenn nicht ist das undefiniertes Verhalten beim <code>delete</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2295508</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2295508</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Fri, 01 Feb 2013 23:56:07 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Vererbung abstrakter Methode on Sat, 02 Feb 2013 00:22:35 GMT]]></title><description><![CDATA[<p>Darum gehts nicht, fürchte ich.</p>
<pre><code>std::vector&lt;std::string&gt; scheduler::schedule(int duration) { 
    std::cout &lt;&lt; &quot;MamaScheduler&quot; &lt;&lt; std::endl; 
    scheduleAlgorithm(); //Aufruf der virtuellen Methode 
}
</code></pre>
<p>returnt nix.</p>
<pre><code>int main() {
	vector&lt;process&gt; proc;
	int totalDuration=100;

	scheduler* test = new fifo(proc);
	{
		vector&lt;string&gt; res = test-&gt;schedule(totalDuration); //Diese Methode verursacht den Fehler indirekt
		//res ist kaputt!
		cout&lt;&lt;&quot;noch lebt er&quot;&lt;&lt;endl;
		cin.get();
		//res wird jetzt destruiert
	}//Bumm
	cout&lt;&lt;&quot;jetzt ist er schon tot&quot;&lt;&lt;endl;
	delete test;
	cin.get();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2295512</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2295512</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 02 Feb 2013 00:22:35 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Vererbung abstrakter Methode on Sat, 02 Feb 2013 00:13:53 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>Ah ok <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="🙂"
    /> Das wusste ich nicht. Gibt es dafür einen Grund? Immerhin erbe ich die Methode, sodass sie deklariert sein sollte. In Java ist das nicht nötig.</p>
<p>Bis jetzt funktioniert alles soweit, doch mich quält ein Segmentation Error. Könnt ihr mal drüber schauen?</p>
<pre><code class="language-cpp">class scheduler {

	protected:
		virtual void scheduleAlgorithm() = 0; //eine virtuelle Methode für die Kinder
		std::vector&lt;process&gt; processes;	

	public:
		scheduler(std::vector&lt;process&gt; p) {processes = p;}
		~scheduler(){};
		std::vector&lt;std::string&gt; schedule(int);
		

};

std::vector&lt;std::string&gt; scheduler::schedule(int duration) {

	std::cout &lt;&lt; &quot;MamaScheduler&quot; &lt;&lt; std::endl;
	scheduleAlgorithm(); //Aufruf der virtuellen Methode
}

class fifo : public scheduler{ //ein Kind von scheduler

	public: 	
		fifo(std::vector&lt;process&gt;);
		~fifo(){}
		void scheduleAlgorithm(); 
};

fifo::fifo(std::vector&lt;process&gt; p) : scheduler(p) {

}

void fifo::scheduleAlgorithm() {
	std::cout &lt;&lt; &quot;Fifo-Algorithmus&quot; &lt;&lt; std::endl; //die virtuelle Methode wird definiert
}
</code></pre>
<p>In der main mache ich dann folgendes:</p>
<pre><code class="language-cpp">scheduler* test = new fifo(proc); //edit: Rechtschreibfehler verbessert
vector&lt;string&gt; res = test-&gt;schedule(totalDuration); //Diese Methode verursacht den Fehler
delete test;
</code></pre>
<p>Die Ausgabe erfolg nach meinen Erwartungen, doch danach kommt es zu einem Speicherzugriffsfehler:</p>
<p>MamaScheduler<br />
Fifo-Algorithmus<br />
./run.s: line 3: 5885 Segmentation fault ./scheduler &quot;processes.txt&quot;</p>
<p>Ich arbeite mit keinen Zeigern (außer für &quot;test&quot;). Ich dachte, dass es irgendwie am Aufräumen liegt, doch den (sinnlosen) Destuktor rufe ich auf.</p>
<p>Weiß jemand weiter?</p>
<p>Vielen Dank<br />
LG, freakC++</p>
</blockquote>
<p>Drüberschauen hat nichts ergeben.</p>
<p>Wir gehen aber auch nicht davon aus, daß Du Compilerwarnungen ignorierst oder abgeschaltet hast. Sowas pöses!</p>
<p>Und hättest Du vollständigen Code gezeigt (Gerade groß genug, um lauffähig zu sein, ansonsten minimal, gerade mal den Fehler erzeugend bitte), hätte ich das schnell laden können und testen. So mußte ich erstmal eine Minute lang Drumherumsachen bauen, eine main(), Sachen includen und so. Dazu hatte ich natürlich wenig Lust, weshalb ich auch erstmal nicht antwortete.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2295513</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2295513</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 02 Feb 2013 00:13:53 GMT</pubDate></item></channel></rss>