<?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[Besere Lösung gesucht (Polymorphie)]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich habe folgendes Minimalbeispiel. Es soll eine Basisklasse geben, die etwas tut (hier Object, diese initialisiert ihren member im c'tor).<br />
Nun gibt es abgeleitete abstrakte Klassen die etwas können sollen (wie Creature, soll hallo sagen können) und ihre Ableitungen (Human und Chicken) die letztentlich hallo-sagen implementieren.</p>
<p>Angenommen zur Initialisierung von Object ist noch nicht bekannt was einmal mit Object und deren membern geschehen soll. Diese sollen unterschiedlich interpretiert werden können. (Angedeutet dadurch, dass member bei Chicken die Körner sind, und bei Human die Dollers in der Tasche).</p>
<p>Wie kann ich die Umwandlung von Object zu Chicken bzw zu Human elegant vornehmen, sodass SayHello() von Creature die jeweilige polymorphe Methode aufruft?</p>
<p>Meine einzige Idee war den Copy-Konstruktur zu nutzen und Chicken bzw Human neu anzulegen. Hat jmd eine besser Idee?</p>
<p>Viele Grüße,<br />
K.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class Object
{
public:	
	Object():member(4) 
	{}
	virtual ~Object()
	{
		std::cout &lt;&lt; &quot;Object died.&quot; &lt;&lt; std::endl;
	}
protected:
	int member;
};

class Creature
	: public Object
{
public:
	virtual void SayHello() const = 0;
};

class Human
	: public Creature
{
public:
	~Human()
	{
		std::cout &lt;&lt; &quot;Human died.&quot; &lt;&lt; std::endl;
	}

	void SayHello() const 
	{
		std::cout &lt;&lt; &quot;Jo, hello! I have &quot;&lt;&lt; member &lt;&lt;&quot; $ in my pocket.&quot; &lt;&lt; std::endl;
	}
};

class Chicken
	: public Creature
{
public:
	~Chicken()
	{
		std::cout &lt;&lt; &quot;Chicken died.&quot; &lt;&lt; std::endl;
	}

	void SayHello() const 
	{
		std::cout &lt;&lt; &quot;Put put! I search for &quot; &lt;&lt; member &lt;&lt; &quot; grains.&quot;&lt;&lt; std::endl;
	}
};

int main()
{
	//zur Initialisierung weiß ich noch nicht dass dies eine Creature wird, es könnte auch z.B. ein Auto werden. Das kann dann nicht Hallo sagen.
	Object o;

	//nun ist die initislierung abgeschlossen und ich möchte o als Human und als Chicken behandeln.
	const Creature * livingThing;
	livingThing = new Chicken( *static_cast&lt;Chicken*&gt;(&amp;o) );
	//livingThing = reinterpret_cast&lt;Chicken*&gt;(&amp;o) ;
	livingThing-&gt;SayHello();
	delete livingThing;

	livingThing = new Human( *static_cast&lt;Human*&gt;(&amp;o) );
	livingThing-&gt;SayHello();
	delete livingThing;

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/297694/besere-lösung-gesucht-polymorphie</link><generator>RSS for Node</generator><lastBuildDate>Fri, 14 Aug 2026 07:29:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/297694.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 04 Jan 2012 18:35:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Besere Lösung gesucht (Polymorphie) on Wed, 04 Jan 2012 18:35:14 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich habe folgendes Minimalbeispiel. Es soll eine Basisklasse geben, die etwas tut (hier Object, diese initialisiert ihren member im c'tor).<br />
Nun gibt es abgeleitete abstrakte Klassen die etwas können sollen (wie Creature, soll hallo sagen können) und ihre Ableitungen (Human und Chicken) die letztentlich hallo-sagen implementieren.</p>
<p>Angenommen zur Initialisierung von Object ist noch nicht bekannt was einmal mit Object und deren membern geschehen soll. Diese sollen unterschiedlich interpretiert werden können. (Angedeutet dadurch, dass member bei Chicken die Körner sind, und bei Human die Dollers in der Tasche).</p>
<p>Wie kann ich die Umwandlung von Object zu Chicken bzw zu Human elegant vornehmen, sodass SayHello() von Creature die jeweilige polymorphe Methode aufruft?</p>
<p>Meine einzige Idee war den Copy-Konstruktur zu nutzen und Chicken bzw Human neu anzulegen. Hat jmd eine besser Idee?</p>
<p>Viele Grüße,<br />
K.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class Object
{
public:	
	Object():member(4) 
	{}
	virtual ~Object()
	{
		std::cout &lt;&lt; &quot;Object died.&quot; &lt;&lt; std::endl;
	}
protected:
	int member;
};

class Creature
	: public Object
{
public:
	virtual void SayHello() const = 0;
};

class Human
	: public Creature
{
public:
	~Human()
	{
		std::cout &lt;&lt; &quot;Human died.&quot; &lt;&lt; std::endl;
	}

	void SayHello() const 
	{
		std::cout &lt;&lt; &quot;Jo, hello! I have &quot;&lt;&lt; member &lt;&lt;&quot; $ in my pocket.&quot; &lt;&lt; std::endl;
	}
};

class Chicken
	: public Creature
{
public:
	~Chicken()
	{
		std::cout &lt;&lt; &quot;Chicken died.&quot; &lt;&lt; std::endl;
	}

	void SayHello() const 
	{
		std::cout &lt;&lt; &quot;Put put! I search for &quot; &lt;&lt; member &lt;&lt; &quot; grains.&quot;&lt;&lt; std::endl;
	}
};

int main()
{
	//zur Initialisierung weiß ich noch nicht dass dies eine Creature wird, es könnte auch z.B. ein Auto werden. Das kann dann nicht Hallo sagen.
	Object o;

	//nun ist die initislierung abgeschlossen und ich möchte o als Human und als Chicken behandeln.
	const Creature * livingThing;
	livingThing = new Chicken( *static_cast&lt;Chicken*&gt;(&amp;o) );
	//livingThing = reinterpret_cast&lt;Chicken*&gt;(&amp;o) ;
	livingThing-&gt;SayHello();
	delete livingThing;

	livingThing = new Human( *static_cast&lt;Human*&gt;(&amp;o) );
	livingThing-&gt;SayHello();
	delete livingThing;

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2163804</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2163804</guid><dc:creator><![CDATA[Ka55i0peia]]></dc:creator><pubDate>Wed, 04 Jan 2012 18:35:14 GMT</pubDate></item><item><title><![CDATA[Reply to Besere Lösung gesucht (Polymorphie) on Wed, 04 Jan 2012 19:02:35 GMT]]></title><description><![CDATA[<p>Das geht so nicht.</p>
<p>&quot;o&quot; vom Typ Object kann nicht zum Typ Human oder Chicken werden. In dieser Form ist dein Sourcecode fehlerhaft.</p>
<p>Beschreib doch mal, was du <em>wirklich</em> machen willst (abseits von Menschen und Hühnern), dann können wir dir sicherlich eine schöne Lösung nennen! <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2163811</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2163811</guid><dc:creator><![CDATA[fdfdg]]></dc:creator><pubDate>Wed, 04 Jan 2012 19:02:35 GMT</pubDate></item><item><title><![CDATA[Reply to Besere Lösung gesucht (Polymorphie) on Wed, 04 Jan 2012 19:31:27 GMT]]></title><description><![CDATA[<p>So funktioniert Polymorphie nicht in C++. Ein Basisklassenobjekt ist keine Stammzelle, die durch geeignetes Casten zur Leberzelle wird.</p>
<pre><code class="language-cpp">//nun ist die initislierung abgeschlossen und ich möchte o als Human und als Chicken behandeln. 
    const Creature * livingThing; 
    livingThing = new Chicken( *static_cast&lt;Chicken*&gt;(&amp;o) );
</code></pre>
<p><code>new Chicken</code> ruft automatisch den Basisklassenkonstruktor von <code>Creature</code> und <code>Object</code> auf. Das Objekt <code>o</code> ist nicht noetig. Also</p>
<pre><code class="language-cpp">const Creature * livingThing; 
    livingThing = new Chicken;
</code></pre>
<blockquote>
<p>von Object zu Chicken bzw zu Human</p>
</blockquote>
<p>Wann bitte werden denn Huehner zu Menschen. Ok, es gibt Werwoelfe. Aber sie verwandeln sich, d.h. es sollte eine Funktion <code>transform</code> geben, die ein Mensch-Objekt konsumiert und ein Wolfobjekt produziert (bzw. auch anders herum).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2163820</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2163820</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Wed, 04 Jan 2012 19:31:27 GMT</pubDate></item><item><title><![CDATA[Reply to Besere Lösung gesucht (Polymorphie) on Thu, 05 Jan 2012 04:30:08 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<blockquote>
<p>von Object zu Chicken bzw zu Human</p>
</blockquote>
<p>Wann bitte werden denn Huehner zu Menschen. Ok, es gibt Werwoelfe. Aber sie verwandeln sich, d.h. es sollte eine Funktion <code>transform</code> geben, die ein Mensch-Objekt konsumiert und ein Wolfobjekt produziert (bzw. auch anders herum).</p>
</blockquote>
<p>Vorausgesetzt die Identität des Menschen ist wichtig, wäre das wohl eher was für das State Pattern. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2163900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2163900</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 05 Jan 2012 04:30:08 GMT</pubDate></item><item><title><![CDATA[Reply to Besere Lösung gesucht (Polymorphie) on Thu, 05 Jan 2012 15:25:07 GMT]]></title><description><![CDATA[<p>Das state pattern kannte ich noch nicht!<br />
is ein guter tipp, auf den man eventuell zurück greifen kann.</p>
<p>knivil schrieb:</p>
<blockquote>
<p>[...]Aber sie verwandeln sich, d.h. es sollte eine Funktion <code>transform</code> geben, die ein Mensch-Objekt konsumiert und ein Wolfobjekt produziert (bzw. auch anders herum).</p>
</blockquote>
<p>Danke für den Hinweis. Manchmal sieht man den Wald vor lauter Bäumen nicht. So reicht doch ein Konstruktor in Chicken aus, der ein Object erwartet. (Alternativ kann man das ja auch in einer Methode transform einbauen).</p>
<p>Danke für den Hinweis!</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class Object
{
public:	
	Object():member(4) 
	{
	}
	virtual ~Object()
	{
	}
protected:
	int member;
};

class Creature
	: public Object
{
public:
	Creature(const Object&amp; o)
		: Object(o)
	{
	}
	virtual void SayHello() const = 0;
};

class Chicken
	: public Creature
{
public:
	Chicken(const Object&amp; o)
		: Creature(o)
	{
	}

	static Chicken* transform(const Object&amp; o)
	{
		return new Chicken(o);
	}

	void SayHello() const ;
};

int main()
{
	Object o;

	Chicken cicken(o);
	//alternativ: Chicken::transform(o);
	cicken.SayHello();

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2164167</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2164167</guid><dc:creator><![CDATA[Ka55i0peia]]></dc:creator><pubDate>Thu, 05 Jan 2012 15:25:07 GMT</pubDate></item></channel></rss>