<?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[Verständnissproblem bei Polymorphismus!]]></title><description><![CDATA[<p>Hallo Forenmitgliedern!</p>
<p>Ich bin gerade dabei, die Vererbung von C++ zu lernen, bleibe bei einem praktischen Beispiel aber leider total hängen.<br />
Meine Idee welche ich umsetzen möchte ist folgende:<br />
Es gibt mehrere Items, welche alle eine ID und einen Preis haben und sich in ihrer Funktion und in ihrem Output unterscheiden.<br />
Deswegen möchte ich eine Basisklasse Items machen und davon dann konkrete Items(z.B. Potions) ableiten.<br />
Meine Basisklasse (Items.h):</p>
<pre><code class="language-cpp">class Items
{

public: 

	int id_;
	int price_;
	void output();
	void execute();

};
</code></pre>
<p>So, nun habe ich eine abgeleitete Klasse Potion:</p>
<pre><code class="language-cpp">class Potion : public Items
{
	public:

	int getAmount();

};
</code></pre>
<p>Diese hat jetzt die Membervariablen id_ und price_.<br />
Hier ist jetzt mein Verständnissproblem.<br />
Wenn ich die konkreten Werte von id_ und price_ jetzt im Konstruktor initialisiere mit:</p>
<pre><code class="language-cpp">Potion::Potion()
{
  price_ = 200;
  id_ = 0;

}
</code></pre>
<p>habe ich dann eine Speicherersparnis?<br />
Also habe ich den konkreten Wert 200 von price_ dann auf die Speicherstelle von price_ der Basisklasse geschrieben, oder wird ein eigener Speicher dafür initialisiert?<br />
Was habe ich hier jetzt für einen Vorteil gegenüber wenn ich für jedes Item price_ und id_ extra initialisiere (außer Codelänge).</p>
<p>Wenn ich in der main.cpp mit</p>
<pre><code class="language-cpp">Potion potion;
</code></pre>
<p>ein Objekt instantiieren möchte, dann kommt der Fehler undefined reference to `Potion::Potion()</p>
<p>Ich habe die Header aber includiert!</p>
<p>Danke schon im Vorhinein für die Antworten!</p>
<p>mfg trunksen</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/285812/verständnissproblem-bei-polymorphismus</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 02:35:26 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/285812.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 28 Apr 2011 12:03:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verständnissproblem bei Polymorphismus! on Thu, 28 Apr 2011 12:03:16 GMT]]></title><description><![CDATA[<p>Hallo Forenmitgliedern!</p>
<p>Ich bin gerade dabei, die Vererbung von C++ zu lernen, bleibe bei einem praktischen Beispiel aber leider total hängen.<br />
Meine Idee welche ich umsetzen möchte ist folgende:<br />
Es gibt mehrere Items, welche alle eine ID und einen Preis haben und sich in ihrer Funktion und in ihrem Output unterscheiden.<br />
Deswegen möchte ich eine Basisklasse Items machen und davon dann konkrete Items(z.B. Potions) ableiten.<br />
Meine Basisklasse (Items.h):</p>
<pre><code class="language-cpp">class Items
{

public: 

	int id_;
	int price_;
	void output();
	void execute();

};
</code></pre>
<p>So, nun habe ich eine abgeleitete Klasse Potion:</p>
<pre><code class="language-cpp">class Potion : public Items
{
	public:

	int getAmount();

};
</code></pre>
<p>Diese hat jetzt die Membervariablen id_ und price_.<br />
Hier ist jetzt mein Verständnissproblem.<br />
Wenn ich die konkreten Werte von id_ und price_ jetzt im Konstruktor initialisiere mit:</p>
<pre><code class="language-cpp">Potion::Potion()
{
  price_ = 200;
  id_ = 0;

}
</code></pre>
<p>habe ich dann eine Speicherersparnis?<br />
Also habe ich den konkreten Wert 200 von price_ dann auf die Speicherstelle von price_ der Basisklasse geschrieben, oder wird ein eigener Speicher dafür initialisiert?<br />
Was habe ich hier jetzt für einen Vorteil gegenüber wenn ich für jedes Item price_ und id_ extra initialisiere (außer Codelänge).</p>
<p>Wenn ich in der main.cpp mit</p>
<pre><code class="language-cpp">Potion potion;
</code></pre>
<p>ein Objekt instantiieren möchte, dann kommt der Fehler undefined reference to `Potion::Potion()</p>
<p>Ich habe die Header aber includiert!</p>
<p>Danke schon im Vorhinein für die Antworten!</p>
<p>mfg trunksen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2055525</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2055525</guid><dc:creator><![CDATA[trunksen]]></dc:creator><pubDate>Thu, 28 Apr 2011 12:03:16 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnissproblem bei Polymorphismus! on Thu, 28 Apr 2011 12:16:32 GMT]]></title><description><![CDATA[<p>Also erst mal hat undefined Reference im Normalfall nichts mit den Headern zu tun, sondern mit der Definition, diese steht ja normal in einer Quelldatei.</p>
<p>So dann, hast du im Konstruktor von Potion keine Initialisierungen, sondern Zuweisungen. Man nimmt dafür normalerweise die Elementinitialisierungsliste:</p>
<pre><code class="language-cpp">Potion() : price_2( 200 ), id_( 0 ) {}
</code></pre>
<p>Zudem, musst aber der Konstuktor der Basisklasse, den Basisteil initialisieren.<br />
Du musst ihn also in der Elementinitialisierungsliste aufrufen:</p>
<pre><code class="language-cpp">Potion() : Items() {}
</code></pre>
<p>Dieses Beispiel ergibt aber keinen Sinn, hier würde es reichen den Basiskonstruktor zu definieren, und bei der abgeleiteten Klasse den Standardkonstruktor vom Compiler zu verwenden, da er automatisch den Basiskonstruktor aufruft und deine abgeleitete Klasse ja keine neuen Elemente hat.</p>
<p>Lg freeG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2055531</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2055531</guid><dc:creator><![CDATA[fr33g]]></dc:creator><pubDate>Thu, 28 Apr 2011 12:16:32 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnissproblem bei Polymorphismus! on Thu, 28 Apr 2011 12:19:26 GMT]]></title><description><![CDATA[<blockquote>
<p>Meine Basisklasse (Items.h):</p>
<pre><code class="language-cpp">class Items
{

public: 

	int id_;
	int price_;
	void output();
	void execute();

};
</code></pre>
</blockquote>
<p>Die Member id und price sollten private sein, höchsten protected, aber nicht public. Sonst kann da jeder dran rumpfuschen. Das widerspricht dem Konzept der Kapselung.</p>
<p>trunksen schrieb:</p>
<blockquote>
<p>So, nun habe ich eine abgeleitete Klasse Potion:</p>
<pre><code class="language-cpp">class Potion : public Items
{
	public:
	
	int getAmount();

};
</code></pre>
<p>Diese hat jetzt die Membervariablen id_ und price_.</p>
</blockquote>
<p>Nein, nicht direkt. Sie hat ein Basisklassenobjekt vom Typ Items, und <em>das</em> hat die beiden Membervariablen.</p>
<p>trunksen schrieb:</p>
<blockquote>
<p>Wenn ich die konkreten Werte von id_ und price_ jetzt im Konstruktor initialisiere mit:</p>
<pre><code class="language-cpp">Potion::Potion()
{
  price_ = 200;
  id_ = 0;

}
</code></pre>
<p>habe ich dann eine Speicherersparnis?</p>
</blockquote>
<p>Du solltest die Werte durch den Konstruktor der Basisklasse initialisieren, nicht im eigentlichen Konstruktor. Lies dir mal im Netz ein paar Dinge zum Thema &quot;Vererbung&quot; und &quot;Ist-ein&quot;-Beziehung durch.</p>
<blockquote>
<p>Also habe ich den konkreten Wert 200 von price_ dann auf die Speicherstelle von price_ der Basisklasse geschrieben, oder wird ein eigener Speicher dafür initialisiert?</p>
</blockquote>
<p>Richtig, du änderst direkt die Member der Basisklasse. Ist aber schlechter Stil, wie gesagt, Kapselung und so <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>Was habe ich hier jetzt für einen Vorteil gegenüber wenn ich für jedes Item price_ und id_ extra initialisiere (außer Codelänge).</p>
</blockquote>
<p>Es geht nicht nur um Codelänge, sondern auch um Wiederverwendung von Code - und darum dass du eine Änderung am gemeinsamen Verhalten von items nicht per Copy&amp;Paste an jeder einzelnen Klasse vornehmen musst (und am Ende ein oder zwei übersiehst). Es gibt noch weitere wichtige Gründe für Vererbung, z.B. Polymorphie, allerdings geht das schon über deine Kenntnisse hinaus, da fehlen scheinbar noch die Basics, und die solltest du zuerst sicher und verstanden haben.</p>
<blockquote>
<p>Wenn ich in der main.cpp mit</p>
<pre><code class="language-cpp">Potion potion;
</code></pre>
<p>ein Objekt instantiieren möchte, dann kommt der Fehler undefined reference to `Potion::Potion()</p>
<p>Ich habe die Header aber includiert!</p>
<p>Danke schon im Vorhinein für die Antworten!</p>
<p>mfg trunksen</p>
</blockquote>
<p>Hast du den Kontruktor im Header definiert? Falls nein, musst du auch die .cpp wo du ihn definiert hast mit zu deinem Projekt linken.<br />
Falls ja, zeig uns bitte den genauen Code (Klassendefinition und Aufruf des Konstruktors)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2055533</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2055533</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 28 Apr 2011 12:19:26 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnissproblem bei Polymorphismus! on Thu, 28 Apr 2011 13:33:16 GMT]]></title><description><![CDATA[<p>Vielen Dank für die schnellen Antworten!</p>
<blockquote>
<p>Dieses Beispiel ergibt aber keinen Sinn[...]</p>
</blockquote>
<p>Wie gesagt, ich habe da noch ein Verständnissproblem!</p>
<blockquote>
<p>Du solltest die Werte durch den Konstruktor der Basisklasse initialisieren</p>
</blockquote>
<p>Ok, das verstehe ich jetzt nicht! Dann habe ich ja einen Wert für price_ und id_ für alle Items! Oder wie werden die dann zugewiesen?<br />
Also ich habe einmal probiert den Basiskonstruktor so zu schreiben:</p>
<pre><code class="language-cpp">Items::Items(int price_, int id_)
{  

}
</code></pre>
<p>und keinen Potion Konstruktor mehr.<br />
Wenn ich jetzt</p>
<pre><code class="language-cpp">Potion potion
</code></pre>
<p>mache, wird dann dieser Konstruktor aufgerufen?<br />
Und wie weiße ich jetzt die konkreten Werte für Potion id_ zu?</p>
<blockquote>
<p>Lies dir mal im Netz ein paar Dinge zum Thema &quot;Vererbung&quot; und &quot;Ist-ein&quot;-Beziehung durch.</p>
</blockquote>
<p>Habe ich, allerdings habe ich noch kein gutes praktisches Bsp. gefunden, sondern immer nur Theorie (a la: protected Ableiten etc.)</p>
<p>mfg trunksen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2055573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2055573</guid><dc:creator><![CDATA[trunksen]]></dc:creator><pubDate>Thu, 28 Apr 2011 13:33:16 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnissproblem bei Polymorphismus! on Thu, 28 Apr 2011 13:41:26 GMT]]></title><description><![CDATA[<p>Du mußt dem Compiler mitteilen, welchen Konstruktor er verwenden soll (andernfalls nimmt er den Default-Konstruktor, sofern einer existiert):</p>
<pre><code class="language-cpp">class Potion : public Items
{
public:
  Potion() : Items(200,0) {} //Aufruf des Basis-Ctors
  ...
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2055578</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2055578</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 28 Apr 2011 13:41:26 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnissproblem bei Polymorphismus! on Mon, 02 May 2011 12:08:49 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Wieder danke für die Antwort und eine Entschuldigung, dass ich so spät erst wieder antworte!<br />
Ich habe jetzt die Methode von CStoll probiert und ein neues Item (Monsterball) hinzugefügt!<br />
Basisklasse Items.h:</p>
<pre><code class="language-cpp">class Items
{

protected: 

	int id_;
	int price_;
	Items(int id_, int price_);

public:

	void output();
	void execute();
};
</code></pre>
<p>Potion.h:</p>
<pre><code class="language-cpp">class Potion : public Items
{
	public:

	int getAmount();
	Potion(): Items(200,0) {}

};
</code></pre>
<p>MonsterBall.h:</p>
<pre><code class="language-cpp">class Monsterball : public Items
{
	public:

	Monsterball(): Items(300,1) {}

};
</code></pre>
<p>und zu am Schluss die 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="😉"
    /></p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;Items.h&quot;
#include &quot;Potion.h&quot;
#include &quot;MonsterBall.h&quot;

int main()
{
  Potion potion;
  Monsterball mb;

}
</code></pre>
<p>Hier kommt jetzt aber ein undefined reference Fehler:</p>
<pre><code>/tmp/ccQyNoqo.o: In function `Potion::Potion()':
main.cpp:(.text._ZN6PotionC2Ev[_ZN6PotionC5Ev]+0x1d): undefined reference to `Items::Items(int, int)'
/tmp/ccQyNoqo.o: In function `Monsterball::Monsterball()':
main.cpp:(.text._ZN11MonsterballC2Ev[_ZN11MonsterballC5Ev]+0x1d): undefined reference to `Items::Items(int, int)'
collect2: ld returned 1 exit status
</code></pre>
<p>Wenn ich die Fehlermeldung richtig interpretiere, dann hat er beim Aufruf der Konstruktoren in der main keinen Link zum Ctor von Items.<br />
Aber warum, ich habe Items.h ja includiert.</p>
<p>Hoffe jemand kann mir helfen.</p>
<p>mfg trunksen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2057122</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2057122</guid><dc:creator><![CDATA[trunksen]]></dc:creator><pubDate>Mon, 02 May 2011 12:08:49 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnissproblem bei Polymorphismus! on Mon, 02 May 2011 12:12:35 GMT]]></title><description><![CDATA[<p>Es gibt dort aber keine Definition für den Items Konstruktur, nur eine Deklaration.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2057124</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2057124</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Mon, 02 May 2011 12:12:35 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnissproblem bei Polymorphismus! on Mon, 02 May 2011 12:14:01 GMT]]></title><description><![CDATA[<p>trunksen schrieb:</p>
<blockquote>
<p>Wenn ich die Fehlermeldung richtig interpretiere, dann hat er beim Aufruf der Konstruktoren in der main keinen Link zum Ctor von Items.<br />
Aber warum, ich habe Items.h ja includiert.</p>
</blockquote>
<p>Es fehlt &quot;ihm&quot; nicht der Link... Dem Linker fehlt die Defintion (sprich: Implementierung) des Konstruktors. Diese hast du wahrscheinlich in einer .cpp liegen. Diese muss erst kompiliert und das entstehende object-file mitgelinkt werden.<br />
Wie kompilierst du denn?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2057125</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2057125</guid><dc:creator><![CDATA[Proxyquantl]]></dc:creator><pubDate>Mon, 02 May 2011 12:14:01 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnissproblem bei Polymorphismus! on Mon, 02 May 2011 12:27:03 GMT]]></title><description><![CDATA[<blockquote>
<p>Diese muss erst kompiliert und das entstehende object-file mitgelinkt werden.</p>
</blockquote>
<p>*Gegenkopfhau* Ja klar!<br />
Ich habe jetzt eine Items.cpp erstellt mit:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;Items.h&quot;
Items::Items(int id_, int price_)
{

}
</code></pre>
<p>und diese mit -Wall mit-compiliert.<br />
Jetzt funktioniert es!</p>
<p>Vielen vielen dank für eure Hilfe!</p>
<p>mfg trunksen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2057133</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2057133</guid><dc:creator><![CDATA[trunksen]]></dc:creator><pubDate>Mon, 02 May 2011 12:27:03 GMT</pubDate></item></channel></rss>