<?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[Probleme mit Vererbung]]></title><description><![CDATA[<p>Halli hallo zusammen. Ich stoße beim üben für eine Klausur immer wieder auf das gleiche Problem beim Thema Vererbung. Hier mal eine Beispielaufgabenstellung, der Code, welchen ich bisher habe folgt anschließend.</p>
<h2>Programmieren Sie die Gehaltsabrechnung für einen Fußballverein. Dazu sollen<br />
von einer Klasse Mitarbeiter die beiden Klassen Spieler und Trainer<br />
abgeleitet werden.<br />
Jedem Mitarbeiter wird eine Personalnummer vom Datentyp int zugeordnet.<br />
Außerdem soll für jeden Mitarbeiter eine Methode void berechneGehalt() zur<br />
Verfügung stehen.<br />
Das Gehalt eines Spielers berechnet aus der Anzahl der geschossenen Tore<br />
multipliziert mit 500 €. Die Tore sollen als Attribut des Spielers gespeichert<br />
werden.<br />
Das Gehalt des Trainers berechnet aus der Anzahl der geleisteten<br />
Trainingsstunden (Datentyp int) multipliziert mit 20 €/h. Die Stunden sollen als<br />
Attribut des Trainers gespeichert werden.<br />
a) Zeichnen Sie das UML Klassendiagramm für die benötigten Klassen.<br />
b) Programmieren Sie die Klassen und ein Hauptprogramm, dass mit<br />
Hilfe dieser Klassen die im Testlauf wiedergegebene Ausgabe<br />
erzeugt.<br />
Hinweise, verbindlich:<br />
- Es sind keine Konstruktoren oder Destruktoren erforderlich<br />
- Die Eingabe von Personalnummer, Toren und Stunden ist im<br />
Hauptprogramm zu realisieren.<br />
- Die Berechnung und Ausgabe des Gehalts sind in der entsprechenden<br />
Methode von Spieler und Trainer durchzuführen.<br />
- Schreiben Sie ausschließlich in die vorbereiteten Rahmen!<br />
- Ergänzen Sie alle fehlenden #include’s (Punktabzug für überflüssige!)</h2>
<p>Testlauf (Eingaben unterstrichen):<br />
Personalnummer des Spielers = ? 123456<br />
Anzahl der Tore des Spielers 123456= ? 3<br />
Personalnummer des Trainers = ? 987654<br />
Anzahl der Trainingsstunden des Trainers 987654 = ? 50<br />
Das Gehalt des Spielers mit der Nr. 123456 betraegt: 1500 Euro<br />
Das Gehalt des Trainers mit der Nr. 987654 betraegt: 1000 Euro<br />
Press any key to continue</p>
<p>Das main</p>
<pre><code>#include &quot;stdafx.h&quot;
using namespace std;
#include &quot;Spieler.h&quot;
#include &quot;Trainer.h&quot;
#include &quot;Mitarbeiter.h&quot;

int main()
{
	Spieler Spieler;
	Trainer Trainer;

	cout &lt;&lt; &quot;Personalnummer des Spielers = ? &quot;;
	cin &gt;&gt; Spieler.Personalnummer;
	cout &lt;&lt; &quot;Anzahl der Tore des Spielers &quot; &lt;&lt; Spieler.Personalnummer &lt;&lt; &quot; = ? &quot;;
	cin &gt;&gt; Spieler.Tore;

	cout &lt;&lt; &quot;Personalnummer des Trainers = ? &quot;;
	cin &gt;&gt; Trainer.Personalnummer;
	cout &lt;&lt; &quot;Anzahl der Trainingsstunden des Trainers &quot; &lt;&lt; Trainer.Personalnummer &lt;&lt; &quot; = ? &quot;;
	cin &gt;&gt; Trainer.Trainingsstunden;

	//cout &lt;&lt; &quot;Das Gehalt des Spielers mit der Nr. &quot; &lt;&lt; Spieler.Personalnummer &lt;&lt; &quot; betraegt: &quot; &lt;&lt; /*Spieler.berechneGehalt() &lt;&lt;*/ endl;
	//cout &lt;&lt; &quot;Das Gehalt des Trainers mit der Nr. &quot; &lt;&lt; Trainer.Personalnummer &lt;&lt; &quot; betraegt: &quot; &lt;&lt; /*Trainer.berechneGehalt() &lt;&lt;*/ endl;
}
</code></pre>
<p>Mitarbeiter.h</p>
<pre><code>#pragma once

class Mitarbeiter
{
public:
	int Personalnummer;
	void berechneGehalt();
};
</code></pre>
<p>Spieler.h</p>
<pre><code>#pragma once
#include &quot;Mitarbeiter.h&quot;

class Spieler : public Mitarbeiter
{
public:
	int Tore;
};
</code></pre>
<p>Trainer.h</p>
<pre><code>#pragma once
#include &quot;Mitarbeiter.h&quot;

class Trainer : public Mitarbeiter
{
public:
	int Trainingsstunden;
};
</code></pre>
<p>Mitarbeiter.cpp *hust* steht nicht viel drin ^^</p>
<pre><code>#include &quot;StdAfx.h&quot;
#include &quot;.\mitarbeiter.h&quot;
#include &quot;Spieler.h&quot;

using namespace std;

void Mitarbeiter::berechneGehalt()
{

}
</code></pre>
<p>Ich schaffe trotz aller Fummelei nicht, die Berechnung in void Mitarbeiter::berechneGehalt() durchzuführen. Immer wenn ich versuche etwas zu übergeben dann meldet der compiler (VS <a href="http://2003.net" rel="nofollow">2003.net</a>), dass ich es nicht richtig mache. Und ich weiß auch nicht wie ich der Methode klar machen soll, dass sie es grade mit Toren oder Arbeitsstunden zu tun hat, damit sie korrekt entweder mit 20 oder 500 multipliziert.</p>
<p>Hat hier jemand Mitleid mit einem kleinen Elektrotechniker der nicht wirklich viel Ahnung vom Programmieren hat? ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/192522/probleme-mit-vererbung</link><generator>RSS for Node</generator><lastBuildDate>Sun, 27 Sep 2026 12:15:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/192522.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 15 Sep 2007 13:53:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme mit Vererbung on Sat, 15 Sep 2007 13:53:58 GMT]]></title><description><![CDATA[<p>Halli hallo zusammen. Ich stoße beim üben für eine Klausur immer wieder auf das gleiche Problem beim Thema Vererbung. Hier mal eine Beispielaufgabenstellung, der Code, welchen ich bisher habe folgt anschließend.</p>
<h2>Programmieren Sie die Gehaltsabrechnung für einen Fußballverein. Dazu sollen<br />
von einer Klasse Mitarbeiter die beiden Klassen Spieler und Trainer<br />
abgeleitet werden.<br />
Jedem Mitarbeiter wird eine Personalnummer vom Datentyp int zugeordnet.<br />
Außerdem soll für jeden Mitarbeiter eine Methode void berechneGehalt() zur<br />
Verfügung stehen.<br />
Das Gehalt eines Spielers berechnet aus der Anzahl der geschossenen Tore<br />
multipliziert mit 500 €. Die Tore sollen als Attribut des Spielers gespeichert<br />
werden.<br />
Das Gehalt des Trainers berechnet aus der Anzahl der geleisteten<br />
Trainingsstunden (Datentyp int) multipliziert mit 20 €/h. Die Stunden sollen als<br />
Attribut des Trainers gespeichert werden.<br />
a) Zeichnen Sie das UML Klassendiagramm für die benötigten Klassen.<br />
b) Programmieren Sie die Klassen und ein Hauptprogramm, dass mit<br />
Hilfe dieser Klassen die im Testlauf wiedergegebene Ausgabe<br />
erzeugt.<br />
Hinweise, verbindlich:<br />
- Es sind keine Konstruktoren oder Destruktoren erforderlich<br />
- Die Eingabe von Personalnummer, Toren und Stunden ist im<br />
Hauptprogramm zu realisieren.<br />
- Die Berechnung und Ausgabe des Gehalts sind in der entsprechenden<br />
Methode von Spieler und Trainer durchzuführen.<br />
- Schreiben Sie ausschließlich in die vorbereiteten Rahmen!<br />
- Ergänzen Sie alle fehlenden #include’s (Punktabzug für überflüssige!)</h2>
<p>Testlauf (Eingaben unterstrichen):<br />
Personalnummer des Spielers = ? 123456<br />
Anzahl der Tore des Spielers 123456= ? 3<br />
Personalnummer des Trainers = ? 987654<br />
Anzahl der Trainingsstunden des Trainers 987654 = ? 50<br />
Das Gehalt des Spielers mit der Nr. 123456 betraegt: 1500 Euro<br />
Das Gehalt des Trainers mit der Nr. 987654 betraegt: 1000 Euro<br />
Press any key to continue</p>
<p>Das main</p>
<pre><code>#include &quot;stdafx.h&quot;
using namespace std;
#include &quot;Spieler.h&quot;
#include &quot;Trainer.h&quot;
#include &quot;Mitarbeiter.h&quot;

int main()
{
	Spieler Spieler;
	Trainer Trainer;

	cout &lt;&lt; &quot;Personalnummer des Spielers = ? &quot;;
	cin &gt;&gt; Spieler.Personalnummer;
	cout &lt;&lt; &quot;Anzahl der Tore des Spielers &quot; &lt;&lt; Spieler.Personalnummer &lt;&lt; &quot; = ? &quot;;
	cin &gt;&gt; Spieler.Tore;

	cout &lt;&lt; &quot;Personalnummer des Trainers = ? &quot;;
	cin &gt;&gt; Trainer.Personalnummer;
	cout &lt;&lt; &quot;Anzahl der Trainingsstunden des Trainers &quot; &lt;&lt; Trainer.Personalnummer &lt;&lt; &quot; = ? &quot;;
	cin &gt;&gt; Trainer.Trainingsstunden;

	//cout &lt;&lt; &quot;Das Gehalt des Spielers mit der Nr. &quot; &lt;&lt; Spieler.Personalnummer &lt;&lt; &quot; betraegt: &quot; &lt;&lt; /*Spieler.berechneGehalt() &lt;&lt;*/ endl;
	//cout &lt;&lt; &quot;Das Gehalt des Trainers mit der Nr. &quot; &lt;&lt; Trainer.Personalnummer &lt;&lt; &quot; betraegt: &quot; &lt;&lt; /*Trainer.berechneGehalt() &lt;&lt;*/ endl;
}
</code></pre>
<p>Mitarbeiter.h</p>
<pre><code>#pragma once

class Mitarbeiter
{
public:
	int Personalnummer;
	void berechneGehalt();
};
</code></pre>
<p>Spieler.h</p>
<pre><code>#pragma once
#include &quot;Mitarbeiter.h&quot;

class Spieler : public Mitarbeiter
{
public:
	int Tore;
};
</code></pre>
<p>Trainer.h</p>
<pre><code>#pragma once
#include &quot;Mitarbeiter.h&quot;

class Trainer : public Mitarbeiter
{
public:
	int Trainingsstunden;
};
</code></pre>
<p>Mitarbeiter.cpp *hust* steht nicht viel drin ^^</p>
<pre><code>#include &quot;StdAfx.h&quot;
#include &quot;.\mitarbeiter.h&quot;
#include &quot;Spieler.h&quot;

using namespace std;

void Mitarbeiter::berechneGehalt()
{

}
</code></pre>
<p>Ich schaffe trotz aller Fummelei nicht, die Berechnung in void Mitarbeiter::berechneGehalt() durchzuführen. Immer wenn ich versuche etwas zu übergeben dann meldet der compiler (VS <a href="http://2003.net" rel="nofollow">2003.net</a>), dass ich es nicht richtig mache. Und ich weiß auch nicht wie ich der Methode klar machen soll, dass sie es grade mit Toren oder Arbeitsstunden zu tun hat, damit sie korrekt entweder mit 20 oder 500 multipliziert.</p>
<p>Hat hier jemand Mitleid mit einem kleinen Elektrotechniker der nicht wirklich viel Ahnung vom Programmieren hat? ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1365884</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365884</guid><dc:creator><![CDATA[Squizzel]]></dc:creator><pubDate>Sat, 15 Sep 2007 13:53:58 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Vererbung on Sat, 15 Sep 2007 15:18:20 GMT]]></title><description><![CDATA[<p>Hi,</p>
<blockquote>
<p>- Die Eingabe von Personalnummer, Toren und Stunden ist im<br />
Hauptprogramm zu realisieren.</p>
</blockquote>
<p>Hm, Aufrufe a lá &quot;cin &gt;&gt; Spieler.Tore;&quot; sind eigentlich schlecht, da dadurch das Prinzip der Datenkapselung verletzt wird. Benutze doch lieber stattdessen eine eigene Methode, die das dann natürlich <strong>private</strong> Atttribut &quot;Tore&quot; setzt. Dieser übergibst du dann ganz einfach die Anzahl der Tore über 'ne Variable, die die Benutzereingabe speichert. Das wäre die saubere Lösung. Rede mit deinem Kursleiter doch nochmal darüber. Dadurch lässt sich nämlich vieles vereinfachen: das Programm ist bspw. leichter erweiterbar oder andersweilig einsetzbar.</p>
<p>Außerdem solltest du die Klasse &quot;Mitarbeiter&quot; zu einer abstrakten Klasse machen. Abstrakt bedeutet in dem Zusammenhang, dass keine Objekte von dieser Klasse erzeugt werden können, was ja auch nicht erforderlich ist, da ein Mitarbeiter <strong>entweder</strong> ein Spieler oder ein Trainer ist. Die Mitarbeiter-Klasse fasst somit nur deren Eigenschaften und Methoden zur besseren Übersicht zusammen. Um die Klasse abstrakt werden zu lassen, muss mindestens eine rein virtuelle Methode vorhanden sein. Im Beispiel also berechneGehalt(). Virtuelle Methoden werden nach folgendem Schema deklariert: &quot;virtual &lt;Rückgabetyp&gt; &lt;Fkt.sname&gt; () const = 0;&quot;. Es ist dabei noch möglich eine Standardimplementation hinzuzufügen, was in deinem Fall aber keinen Sinn macht, da das Gehalt nun mal unterschiedlich berechnet wird. Da lässt sich einfach nix abstrahieren.</p>
<p>So... jetzt wird auf unsere zwei Unterklassen vererbt, nämlich Spieler und Trainer. In diesen Klassen kannst du berechneGehalt() nun neu definieren. Die Funktion für den Trainerlohn multipliziert also den übergebenen Wert (der Stundenanzahl) mit dem Stundenlohn von 20€. Analoges gilt natürlich für die Funktion in der Spieler-Klasse. In der main()-Funktion musst dann wie du's auch schon gemacht hast, die zur jeweiligen Klassen passende Funktion aufrufen, wie bspw. &quot;spieler.berechneGehalt();&quot;. (Benutze für die Objekte der Klassen lieber die Kleinschreibweise, wie mans auch bei Variablen der Grunddatentypen hält, also &quot;spieler&quot; statt &quot;Spieler&quot;.)</p>
<blockquote>
<p>- Die Berechnung und Ausgabe des Gehalts sind in der entsprechenden<br />
Methode von Spieler und Trainer durchzuführen.</p>
</blockquote>
<p>Hm, das passt nicht so ganz du deinen letzten zwei Zeilen in der main.cpp. <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="😉"
    /><br />
Du musst die Gehaltsfunktionen einen String zurückgeben lassen. Dafür musst du natürlich am besten in der Mitarbeiter-Klasse ein &quot;#include &lt;string&gt;&quot; einfügen. (Dieser include vererbt sich ja auf die beiden anderen Klassen weiter.)</p>
<p>Hoffe, ich konnte dich wieder ein bisschen motivieren und auf den richtigen Weg zurückbringen <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>~ moagnus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1365933</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365933</guid><dc:creator><![CDATA[moagnus]]></dc:creator><pubDate>Sat, 15 Sep 2007 15:18:20 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Vererbung on Sat, 15 Sep 2007 15:47:14 GMT]]></title><description><![CDATA[<p>Man muss zu dieser Aufgabe sagen, dass es eine alte Klausuraufgabe ist, die i.d.R. innerhalb von 20 min gelöst werden soll. Daher wird alles auf ein sehr einfaches Niveau heruntergebrochen um nur die grundlegenden Dinge abzufragen. &quot;Schön&quot; gemacht wird im Praktikum. Leider hatten wir in den Praktika nur Vererbungsaufgaben, in denen die Klassen ausschließlich aufgrufen wurden und keine Werte berechnen sollten.</p>
<p>Da ich deine Ausführungen noch nicht ganz folgen konnte <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="😃"
    /> versuche ich mal die Aufgabenstellung so wiederzugeben wie ich sie verstanden habe. Vielleicht liege ich ja bereits da vollkommen falsch.</p>
<p>1. Ich lese im Hauptprogramm die Werte für den Spieler und den Trainer ein (gemacht)<br />
2.1. Mitarbeiter enthält als Superklasse &quot;int Personalnummer&quot; und &quot;void berechneGehalt()&quot;, auf die die beiden Subklassen zugreifen können (gemacht)<br />
2.2. Spieler enthält &quot;int Tore&quot; (gemacht)<br />
2.3. Trainer enthält &quot;int Arbeitsstunden&quot; (gemacht)<br />
3. Spieler und Trainer greifen auf &quot;berechneGehalt()&quot; zu ihr ... naja ihr gehalt zu berechnen (verzweifelt versucht)</p>
<p>Und genau das ist der knackpunkt bei mir. Ich verstehe das so, dass keine weiteren Methoden in Spieler und Trainer eingefügt werden sollen. Ich habe keinen blassen schimmer davon wie ich der Methode &quot;berechneGehalt()&quot; begreifbar machen soll, dass gerade Spieler auf sie zugreift und sie damit mit 500 multiplizieren sollen.</p>
<p>Ich hatte schonmal eine ähnliche Aufgabe. Dort gab es die Klassen Kreis und Rechteck die auf die Superklasse Fläche zugreifen sollten.<br />
Die Subklasse Kreis beinhaltete &quot;int Radius&quot; und Rechteck &quot;int a, b&quot; je nachdem wer zugriff sollten dann die Methode in Fläche erkennen ob es ein Kreis ist (und damit radius*3.14 rechnen) oder ein rechteck (dann eben a*b).</p>
<p>Kurzum: wie gebe ich den Methoden in Superklassen zu verstehe wer sie grade benutzt?</p>
<p>Vieleicht hast du es schon beantwortet, dann habe ich es aber nicht so richtig verstanden ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1365959</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365959</guid><dc:creator><![CDATA[Squizzel]]></dc:creator><pubDate>Sat, 15 Sep 2007 15:47:14 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Vererbung on Sat, 15 Sep 2007 16:21:00 GMT]]></title><description><![CDATA[<p>Okay ich habe mir die Aufgabenstellung nochmal genau durchgelesen.</p>
<p>Es steht ja geschrieben:</p>
<p>- Die Berechnung und Ausgabe des Gehalts sind in der entsprechenden<br />
Methode von Spieler und Trainer durchzuführen.</p>
<p>Das soll wohl bedeuten, dass ich doch Methoden für Spieler und Trainer schreiben soll.</p>
<p>Welchen Sinn ergibt denn dann noch die Methode berechneGehalt(); in Mitarbeiter?</p>
<p>----------------------------------------------------------------------------------------------------</p>
<p>Um nochmal auf diese andere Aufgabe einzugehen:</p>
<p>*Schreiben Sie ein C++Programm zur Erfassung von Geometrie-Elementen. Dazu<br />
sollen die Klassen kreis und rechteck von der Basisklasse flaeche abgeleitet<br />
werden.</p>
<p>Allen Klassen sind die Eigenschaft flaecheninhalt und die Methode<br />
flaecheninhalt_berechnen() gemeinsam. Darüber hinaus soll die Klasse kreis<br />
das Attribut radius erhalten, während die Klasse rechteck als Attribute die<br />
Seitenlängen a und b erhält.</p>
<p>Der Konstruktor der Basisklasse soll den Text „Neues Flaechenelement “<br />
ausgeben (vgl. Testlauf). Die abgeleiteten Klassen sollen über ihren Konstruktor<br />
die Bezeichnung der Klasse ausgeben und die Werte ihrer jeweiligen Attribute<br />
von der Tastatur einlesen.</p>
<p><strong>Die Methode flaecheninhalt_berechnen() soll den Flächeninhalt nach<br />
folgenden Formeln berechnen und in dem Attribut flaecheninhalt speichern:</strong></p>
<p>Kreis: f = r * r *3.14<br />
Rechteck: f = a * b</p>
<p>a) (3 Punkte) Zeichnen Sie das UML Klassendiagramm.<br />
b) (14 Punkte) Programmieren Sie die Klassen und ein Hauptprogramm, dass<br />
mit Hilfe dieser Klassen die im Testlauf wiedergegebene Ausgabe erzeugt.</p>
<p>Hinweise, verbindlich:<br />
- Es sind keine Destruktoren erforderlich<br />
- Alle Attribute sind vom Typ double.<br />
- Ergänzen Sie alle fehlenden #include Direktiven (Punktabzug für<br />
überflüssige!)<br />
- Schreiben Sie ausschließlich in die vorbereiteten Rahmen!</p>
<p>Testlauf (Eingaben unterstrichen):<br />
Neues Flaechenelement Kreis:<br />
Radius = ? 1<br />
Flaecheninhalt = 3.14<br />
Neues Flaechenelement Rechteck:<br />
a = ? 2<br />
b = ? 3<br />
Flaecheninhalt = 6<br />
Press any key to continue*</p>
<p>Ich habe nochmal fett unterlegt worauf es mir ankommt. Es soll ja ganz offensichtlich ausschließlich in dieser Methode gerechnet werden. Bisher bin ich soweit gekommen:</p>
<pre><code>#include &quot;stdafx.h&quot;
#include &quot;.\flaeche.h&quot;

using namespace std;

void flaeche::flaecheninhalt_berechnen()
{

}

flaeche::flaeche()
{
	cout &lt;&lt; &quot;Neues Flaechenelement &quot;;
}
</code></pre>
<pre><code>#pragma once

class flaeche
{
public:
	double flaecheninhalt;
	void flaecheninhalt_berechnen();
	flaeche();
};
</code></pre>
<pre><code>#include &quot;stdafx.h&quot;
#include &quot;.\kreis.h&quot;

using namespace std;

kreis::kreis()
{
	cout &lt;&lt; &quot;Kreis:&quot; &lt;&lt; endl;
	cout &lt;&lt; &quot;Radius = ? &quot; &lt;&lt; endl;
	cin &gt;&gt; radius;
}
</code></pre>
<pre><code>#pragma once
#include &quot;flaeche.h&quot;

class kreis : public flaeche
{
public:
	double radius;
	kreis();
};
</code></pre>
<pre><code>#include &quot;stdafx.h&quot;
#include &quot;.\rechteck.h&quot;

using namespace std;

rechteck::rechteck()
{
	cout &lt;&lt; &quot;Rechteck:&quot; &lt;&lt; endl;
	cout &lt;&lt; &quot;a = ? &quot;;
	cin &gt;&gt; a;
	cout &lt;&lt; &quot;b = ? &quot;;
	cin &gt;&gt; b;
}
</code></pre>
<pre><code>#pragma once
#include &quot;flaeche.h&quot;

class rechteck : public flaeche
{
public:
	double a;
	double b;
	rechteck();
};
</code></pre>
<p>Hier geht es um die flaeche.cpp. Ich soll dieser Klasse Werte übergeben, er soll entscheiden ob Kreis oder Rechteck und dann soll ich den Wert in Flaecheninhalt zurückgeben. Leider keine Ahnung wie man das macht ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1365974</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365974</guid><dc:creator><![CDATA[Squizzel]]></dc:creator><pubDate>Sat, 15 Sep 2007 16:21:00 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Vererbung on Sat, 15 Sep 2007 22:06:24 GMT]]></title><description><![CDATA[<blockquote>
<p>- Die Berechnung und Ausgabe des Gehalts sind in der entsprechenden<br />
Methode von Spieler und Trainer durchzuführen.</p>
</blockquote>
<p>Naja, das sagt dir ja schon mal, dass du nicht die Gehalts-Funkion der Oberklasse aufrufen darfst.</p>
<p>zu 1) Ist zwar unschön, aber ok. Passt ja, da deine Attribute public sind.<br />
zu 2.x) Jopp, passt.<br />
zu 3) Hm, das ist vllt. wirklich ein bisschen schwierig zu kapieren. Ich schreib's dir mal meinen Vorstellungen entsprechend um:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt; // für std::cout in der Gehalts-Funktion

class Mitarbeiter // abstrakte Klasse; Erstellung von Objekte nicht möglich/notwendig
{
public:
    int Personalnummer;
    virtual void berechneGehalt() = 0; // rein virtuelle Methode durch Zusatz von &quot;=0&quot; deklarieren; Standardimplementation nicht sinnvoll
};

class Spieler : public Mitarbeiter
{
public:
    int Tore;
    virtual void berechneGehalt() { // virtuelle Funktionen haben immer die gleiche Signatur, nur der Funktionskörper kann sich unterscheiden
         std::cout &lt;&lt; Tore*500 &lt;&lt; &quot;€&quot; &lt;&lt; std::endl; // direkte Ausgabe innerhalb der Methode wie verlangt
    } // normalerweise wird Implementation und Deklaration getrennt; zu faul ;)
};

class Trainer : public Mitarbeiter
{
public:
    int Trainingsstunden;
    virtual void berechneGehalt() {
         std::cout &lt;&lt; Trainingsstunden*500 &lt;&lt; &quot;€&quot; &lt;&lt; std::endl; // Attribute besser klein schreiben
    }
};

int main() {
Spieler spieler;
std::cin &gt;&gt; spieler.Tore; // 2 Tore
spieler.berechneGehalt(); // Ausgabe: 2 Tore * 500€ = 1000€
}
</code></pre>
<p>Kompiliert und arbeitet ohne Probleme.</p>
<blockquote>
<p>Du musst die Gehaltsfunktionen einen String zurückgeben lassen. Dafür musst du natürlich am besten in der Mitarbeiter-Klasse ein &quot;#include &lt;string&gt;&quot; einfügen. (Dieser include vererbt sich ja auf die beiden anderen Klassen weiter.)</p>
</blockquote>
<p>Das war natürlich vollkommener Krampf... <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="🙄"
    /> Keine Ahnung, was ich mir dabei gedacht hab. Genau das soll man ja nicht machen...<br />
Und virtuelle Funktionen müssen auch kein &quot;const&quot; am Ende haben. Sorry...</p>
<p>EDIT: Ähm, ich bin jetzt zu faul, deinen letzten Post durchzulesen, aber das Problem sollte sich auch mit einer abstrakten Basisklasse und rein virtuellen Funktionen lösen lassen.<br />
Um deine Frage nach dem Sinn der Gehalts-Funktion in der Basisklasse zu beantworten: Durch rein virtuelle Funktionen wird es möglich, gemeinsame Eigenschaften eventuell schon vorher in ner Standardimplementation zusammenzufassen.</p>
<blockquote>
<p>Außerdem soll für jeden Mitarbeiter eine Methode void berechneGehalt() zur<br />
Verfügung stehen.</p>
</blockquote>
<p>Hier wirds ja sogar explizit gefordert. Jeder Mitarbeiter (Objekt der Klasse Mitarbeiter) soll diese Funktion aufweisen.</p>
<p>Hier ists eigentlich sinnlos... um es halbwegs verständlich zu machen: Ich kann in der Standardimplementation beispielsweise noch hinschreiben, dass vor der Gehaltsausgabe &quot;Gehalt: &quot; auf den Bildschirm geschrieben wird. Das machts aber alles noch ein wenig komplizierter.</p>
<p>Übrigens: Wenn man virtuelle Funktionen verwendet sollte man auch virtuelle Destruktoren definieren. Ansonsten kann es zur Speicherverschwendung kommen (aber auch nur in speziellen Fällen, hier nicht). Inwieweit das deinem Lehrer egal ist, weiß ich nicht... <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/1365984</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365984</guid><dc:creator><![CDATA[moagnus]]></dc:creator><pubDate>Sat, 15 Sep 2007 22:06:24 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Vererbung on Sat, 15 Sep 2007 16:35:28 GMT]]></title><description><![CDATA[<p>Da ich mich gerade mit der dynamischen Speicherverwaltung rumschlage, schaue ich mir deinen Code heute nacht mal an.</p>
<p>Vielen lieben dank schonmal <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 melde mich morgen wieder <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/1365990</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365990</guid><dc:creator><![CDATA[Squizzel]]></dc:creator><pubDate>Sat, 15 Sep 2007 16:35:28 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Vererbung on Sat, 15 Sep 2007 20:16:26 GMT]]></title><description><![CDATA[<p><strong>ACHTUNG!</strong> Nur lesen, wenn du selbst kein Interesse mehr an deiner Geometrieaufgabe hast. <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>Naja, ich hatte nix zu tun und da hab ich mich mal an deine Aufgabe gemacht...</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;cmath&gt; // für M_PI bei Flächenfunktion vom Kreis
using namespace std;

class GraphObj { // Flaeche als Klassenname war mir zu sinnlos :P
	protected: // protected, damit von abgeleiteten Klassen darauf zugegriffen werden kann
		double flaecheninhalt;
	public:
		GraphObj();
		virtual void flaecheninhaltBerechnen(void) = 0;
};

 GraphObj::GraphObj() {
	cout&lt;&lt;&quot;Neues geometrisches Objekt: &quot;;
}
// Standardimplementation der rein virtuellen Methode
inline void GraphObj::flaecheninhaltBerechnen(void) {
	cout&lt;&lt;endl&lt;&lt;&quot;Flaeche A&quot;;
}
// *******************************************
class Kreis : public GraphObj {
		double radius;
	public:
		Kreis(double);
		virtual void flaecheninhaltBerechnen(void);
};

Kreis::Kreis(double rad) : radius(rad) {
	cout&lt;&lt;&quot;Kreis&quot;&lt;&lt;endl;
}
inline void Kreis::flaecheninhaltBerechnen(void) {
	GraphObj::flaecheninhaltBerechnen(); // gibt &quot;Flaeche A&quot; aus
	cout&lt;&lt;&quot;(Kreis) = &quot;;
	double f = radius*radius*M_PI;
	flaecheninhalt = f; // im Attribut des Subobjekts speichern für eventuelle spätere Verwendung
	cout&lt;&lt;f&lt;&lt;endl; // und gleichzeitig ausgeben
}

// *******************************************
class Rechteck : public GraphObj {
		double laenge, breite;
	public:
		Rechteck(double, double);
		virtual void flaecheninhaltBerechnen(void);
};

Rechteck::Rechteck(double l, double b) : laenge(l), breite(b) {
	cout&lt;&lt;&quot;Rechteck&quot;&lt;&lt;endl;
}
inline void Rechteck::flaecheninhaltBerechnen(void) {
	GraphObj::flaecheninhaltBerechnen();
	cout&lt;&lt;&quot;(Rechteck) = &quot;;
	double f = static_cast&lt;double&gt;(laenge*breite);
	flaecheninhalt = f;
	cout&lt;&lt;f&lt;&lt;endl;
}

int main() {
	cout&lt;&lt;&quot;\nRechteck: Bitte Laenge und Breite eingeben. (Komma als Punkt)&quot;&lt;&lt;endl;
	double l, b;
	cin&gt;&gt;l;
	cin&gt;&gt;b;
	Rechteck rechteck(l, b);

	cout&lt;&lt;&quot;\nKreis: Bitte Radius angeben. (Komma als Punkt)&quot;&lt;&lt;endl;
	double r;
	cin&gt;&gt;r;
	Kreis kreis(r);

	rechteck.flaecheninhaltBerechnen();
	kreis.flaecheninhaltBerechnen();

	cout&lt;&lt;&quot;&lt;Enter&gt; zum Beenden druecken.&quot;&lt;&lt;endl;
	// Tastaturpuffer leeren, damit Programm nicht automatisch beendet wird durch Reste im Puffer
	while(cin.get() != '\n') {cin.clear();}
	cin.get();
}
</code></pre>
<p>Code funktioniert einwandfrei, jedoch hab einige &quot;verbindliche Hinweise&quot; großzügig missachtet und ansonsten auch nur meinen eigenen Kopf durchgesetzt <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>
<p>Auswertung:<br />
a) fehlt<br />
b)<br />
* 14 Punkte für fehlerfreie Kompilation ohne Warnungen<br />
* -3 Punkte wegen &quot;überflüssiger&quot; include-Anweisung von cmath<br />
* -3 Punkte wegen modifiziertem Testablauf mit direkter Instanziierung der Klassenobjekte<br />
* -7 Punkte wegen Unvollständigkeit nach 20 Minuten</p>
<p>= 1/17 Punkten (Test bestanden?)</p>
<p>Eine Frage hab ich aber noch (ist vllt. etwas kleinkrämerisch, aber mir ist keine Lösung für dieses &quot;Problem&quot; eingefallen):<br />
Wenn ich ganz sauber bleiben will, muss ich die rein virt. Funktion in der Oberklasse ja mit dem &quot;const&quot;-Zusatz versehen, weil nur eine Ausgabe getätigt wird, jedoch keine Veränderungen vorgenommen werden. Wenn ich nun ableite auf die beiden anderen Klassen muss die Signatur dieser Funktion gleich bleiben, damit sie überschrieben werden kann. In den Unterklassen jedoch wird dem Subobjekt-Attribut der Flächeninhalt zugewiesen. Die Methode kann also nicht &quot;const&quot; deklariert werden. Wie kann man sich da behelfen? Es ist ja auch nicht möglich, in der Basisklasse zwei Verschiedene (eine mit &quot;const&quot;, eine ohne) zu deklarieren, da in den abgeleiteten Klassen dann nicht ersichtlich ist, welche aufgerufen wird, da das &quot;const&quot; hier nicht zum Funktionsaufruf hinzugefügt werden kann.<br />
Fällt jemanden dazu was ein bzw. ... ist das überhaupt vertretbar? <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/1366057</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1366057</guid><dc:creator><![CDATA[moagnus]]></dc:creator><pubDate>Sat, 15 Sep 2007 20:16:26 GMT</pubDate></item></channel></rss>