<?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[Polymorphie in Templates]]></title><description><![CDATA[<p>Nabend,</p>
<p>schonmal vorweg: Ich vermute mal, dass der Titel nicht ganz passt, jedoch weiss ich nicht wie ich es besser allgemein beschreiben sollte.</p>
<p>Ich habe ein Klassentemplate X. In diesem ist eine Methode definiert, die mir eine Instanz des Typs T zurück liefert. Dieser Typ kann auch ein primitiver Datentyp sein.</p>
<p>Ich möchte jedoch alle verschiedenen Instanzen meines Klassentemplates X in eine Liste werfen. Wie kann ich hier dynamisch bleiben? Die Liste muss ja schon mit dem tatsächlichen Typ von T ausgestattet werden (der aber möglicherweise unterschiedlich sein kann).</p>
<p>Mein alternativer Ansatz wäre hier gewesen, eine eigene Klasse für den Rückgabetyp der Methode zu erstellen und die Implementierungen eben hiervon abzuleiten. Jedoch haut das bei den primitiven Datentypen dann wohl nicht mehr hin :/.</p>
<p>Hat jemand eine &quot;Standardlösung&quot; oder allgemein eine schöne Lösung?</p>
<p>Viele Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/288442/polymorphie-in-templates</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 01:26:58 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/288442.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 16 Jun 2011 19:04:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Polymorphie in Templates on Thu, 16 Jun 2011 19:04:42 GMT]]></title><description><![CDATA[<p>Nabend,</p>
<p>schonmal vorweg: Ich vermute mal, dass der Titel nicht ganz passt, jedoch weiss ich nicht wie ich es besser allgemein beschreiben sollte.</p>
<p>Ich habe ein Klassentemplate X. In diesem ist eine Methode definiert, die mir eine Instanz des Typs T zurück liefert. Dieser Typ kann auch ein primitiver Datentyp sein.</p>
<p>Ich möchte jedoch alle verschiedenen Instanzen meines Klassentemplates X in eine Liste werfen. Wie kann ich hier dynamisch bleiben? Die Liste muss ja schon mit dem tatsächlichen Typ von T ausgestattet werden (der aber möglicherweise unterschiedlich sein kann).</p>
<p>Mein alternativer Ansatz wäre hier gewesen, eine eigene Klasse für den Rückgabetyp der Methode zu erstellen und die Implementierungen eben hiervon abzuleiten. Jedoch haut das bei den primitiven Datentypen dann wohl nicht mehr hin :/.</p>
<p>Hat jemand eine &quot;Standardlösung&quot; oder allgemein eine schöne Lösung?</p>
<p>Viele Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2079410</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2079410</guid><dc:creator><![CDATA[skNiNe]]></dc:creator><pubDate>Thu, 16 Jun 2011 19:04:42 GMT</pubDate></item><item><title><![CDATA[Reply to Polymorphie in Templates on Thu, 16 Jun 2011 19:13:36 GMT]]></title><description><![CDATA[<p>Kannst du dein einleitendes Beispiel mal mit Code gestalten?</p>
<p>Ich hab' das jetzt etwa so verstanden:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
class X
{
public:
  T machwas();
};

list&lt;X&gt; mylist; // &lt;- hier alle möglichen Spezialisierungen von X&lt;T&gt; reinpacken
</code></pre>
<p>Kommt das ungefähr hin?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2079419</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2079419</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 16 Jun 2011 19:13:36 GMT</pubDate></item><item><title><![CDATA[Reply to Polymorphie in Templates on Thu, 16 Jun 2011 19:13:57 GMT]]></title><description><![CDATA[<p>Was mir eben noch eingefallen ist ...</p>
<p>Haltet ihr es für sinnvoll, für den Rückgabetyp eine gemeinsame Klasse zu erstellen, und für die primitiven Datentypen einfach Wrapper drum herum zu schreiben?</p>
<pre><code class="language-cpp">struct Basistyp {};

struct Char : Basistyp {
	char c;
	Char(char _c) { c = _c; }
	operator char() {
		return c;
	}
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2079420</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2079420</guid><dc:creator><![CDATA[skNiNe]]></dc:creator><pubDate>Thu, 16 Jun 2011 19:13:57 GMT</pubDate></item><item><title><![CDATA[Reply to Polymorphie in Templates on Thu, 16 Jun 2011 19:15:34 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Kannst du dein einleitendes Beispiel mal mit Code gestalten?</p>
<p>Ich hab' das jetzt etwa so verstanden:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
class X
{
public:
  T machwas();
};

list&lt;X&gt; mylist; // &lt;- hier alle möglichen Spezialisierungen von X&lt;T&gt; reinpacken
</code></pre>
<p>Kommt das ungefähr hin?</p>
</blockquote>
<p>Ja exakt so. Wird bestimmt auch keine Möglichkeit dafür geben oder? Schließlich geht ja die Typsicherheit verloren, und ich kann nicht wissen was ich dann von machwas() zurück bekomme.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2079422</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2079422</guid><dc:creator><![CDATA[skNiNe]]></dc:creator><pubDate>Thu, 16 Jun 2011 19:15:34 GMT</pubDate></item><item><title><![CDATA[Reply to Polymorphie in Templates on Thu, 16 Jun 2011 19:18:25 GMT]]></title><description><![CDATA[<p>Du könntest dem Template eine Basisklasse verpassen und Pointer darauf in einer Liste speichern. Allerdings kommst du da nicht ohne Cast aus, wenn du auf eine bestimmte Spezialisierung zugreifen willst.</p>
<p>PS: Was hast du denn inhaltlich vor? Vielleicht gibt es ja eine bessere Lösung für dein Problem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2079424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2079424</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 16 Jun 2011 19:18:25 GMT</pubDate></item><item><title><![CDATA[Reply to Polymorphie in Templates on Thu, 16 Jun 2011 19:19:48 GMT]]></title><description><![CDATA[<p>in java geht sowas in der richtung</p>
<pre><code class="language-java">public class &lt;extends Blabla&gt; hallo {}
</code></pre>
<p>(ich weiss nicht ob die syntax richtg ist)</p>
<p>also sprich, dass nur klassen die von einer basisklasse erben zugelassen sind ?!?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2079426</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2079426</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Thu, 16 Jun 2011 19:19:48 GMT</pubDate></item><item><title><![CDATA[Reply to Polymorphie in Templates on Thu, 16 Jun 2011 19:21:42 GMT]]></title><description><![CDATA[<p>Java wäre so:</p>
<pre><code class="language-cpp">public class Hallo&lt;T extends Blabla&gt; {}
</code></pre>
<p>Bringt mir hier leider nichts :(.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2079427</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2079427</guid><dc:creator><![CDATA[skNiNe]]></dc:creator><pubDate>Thu, 16 Jun 2011 19:21:42 GMT</pubDate></item><item><title><![CDATA[Reply to Polymorphie in Templates on Thu, 16 Jun 2011 19:23:32 GMT]]></title><description><![CDATA[<p>nein, aber geht sowas in c++?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2079430</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2079430</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Thu, 16 Jun 2011 19:23:32 GMT</pubDate></item><item><title><![CDATA[Reply to Polymorphie in Templates on Thu, 16 Jun 2011 19:33:50 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>nein, aber geht sowas in c++?</p>
</blockquote>
<p>Bei templates ist sowas nicht notwendig, das geht dort implizit. Ein template funktioniert automatisch für jeden Typ der die notwendigen Operationen unterstützt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2079436</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2079436</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Thu, 16 Jun 2011 19:33:50 GMT</pubDate></item><item><title><![CDATA[Reply to Polymorphie in Templates on Thu, 16 Jun 2011 19:34:32 GMT]]></title><description><![CDATA[<p>Die Klasse Document =&gt; Schnittstelle zum Zugriff auf eine Dokumentart, also bspw. eine Datei auf dem Filesystem.</p>
<p>Ich möchte nun alle geöffneten bzw. erstellten Documents in eine liste werfen, um bspw. prüfen zu können, ob ich das Document schon mal geladen hab bzw. schon geladen ist. Jedoch kann der Inhalt variieren, bspw. wchar_t oder char (diese Typen würde ich Document als Parameter übergeben).</p>
<p>Ist mal eine vereinfachte Form.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2079437</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2079437</guid><dc:creator><![CDATA[skNiNe]]></dc:creator><pubDate>Thu, 16 Jun 2011 19:34:32 GMT</pubDate></item><item><title><![CDATA[Reply to Polymorphie in Templates on Thu, 16 Jun 2011 19:37:04 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class DocumentBase
{
public:
  virtual bool isOpen() = 0;
};

template &lt;class CharType&gt;
class Document : public DocumentBase
{
  ...
};

list&lt;DocumentBase*&gt; bla;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2079439</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2079439</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Thu, 16 Jun 2011 19:37:04 GMT</pubDate></item><item><title><![CDATA[Reply to Polymorphie in Templates on Thu, 16 Jun 2011 19:52:24 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<pre><code class="language-cpp">class DocumentBase
{
public:
  virtual bool isOpen() = 0;
};

template &lt;class CharType&gt;
class Document : public DocumentBase
{
  ...
};

list&lt;DocumentBase*&gt; bla;
</code></pre>
</blockquote>
<p>Mh ne sowas mein ich nicht :(.</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
class Document {
	T get();
};
</code></pre>
<p>Angenommen ich möchte jetzt rein zur Verwaltung alle Documents irgendwo weg speichern? Wie stellt man das am besten an? Natürlich wenn die Documents mit unterschiedlichen T's erstellt wurden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2079449</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2079449</guid><dc:creator><![CDATA[skNiNe]]></dc:creator><pubDate>Thu, 16 Jun 2011 19:52:24 GMT</pubDate></item><item><title><![CDATA[Reply to Polymorphie in Templates on Thu, 16 Jun 2011 19:57:38 GMT]]></title><description><![CDATA[<p>Das geht so nicht. Wenn du alle gemeinsam behandeln willst müssen sie eine gemeinsame Basis haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2079452</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2079452</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Thu, 16 Jun 2011 19:57:38 GMT</pubDate></item><item><title><![CDATA[Reply to Polymorphie in Templates on Thu, 16 Jun 2011 20:09:28 GMT]]></title><description><![CDATA[<p>Mh aber selbst wenn ich jetzt folgendes habe:</p>
<pre><code class="language-cpp">struct DocumentBase {
	// irgendwas
};

template&lt;typename T&gt;
struct Document : DocumentBase {
	T value;

	Document(T _value) {
		value = _value;
	}
};
</code></pre>
<p>Das hier funktioniert:</p>
<pre><code class="language-cpp">int main(int argc, char **argv) {
	Document&lt;int&gt; di(1337);
	Document&lt;char&gt; dc('c');

	std::list&lt;Document&lt;int&gt;*&gt; bases;
	bases.push_back(&amp;di);
	//bases.push_back(&amp;dc);

	// Cast zwar überflüssig, aber funktioniert
	Document&lt;int&gt; *dic = dynamic_cast&lt;Document&lt;int&gt;*&gt;(bases.front());
	if (dic != 0) {
		cout &lt;&lt; dic-&gt;value &lt;&lt; endl;
	}

	return 0;
}
</code></pre>
<p>Aber da hier dann wieder nicht. Krieg ich selbst mit einem Cast die tatsächlichen Template-Instanzen raus?</p>
<pre><code class="language-cpp">int main(int argc, char **argv) {
	Document&lt;int&gt; di(1337);
	Document&lt;char&gt; dc('c');

	std::list&lt;DocumentBase*&gt; bases;
	bases.push_back(&amp;di);
	bases.push_back(&amp;dc);

	Document&lt;int&gt; *dic = dynamic_cast&lt;Document&lt;int&gt;*&gt;(bases.front());
	if (dic != 0) {
		cout &lt;&lt; dic-&gt;value &lt;&lt; endl;
	}

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2079455</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2079455</guid><dc:creator><![CDATA[skNiNe]]></dc:creator><pubDate>Thu, 16 Jun 2011 20:09:28 GMT</pubDate></item><item><title><![CDATA[Reply to Polymorphie in Templates on Thu, 16 Jun 2011 20:13:49 GMT]]></title><description><![CDATA[<p>Das sollte so schon funktionieren. Aber besonders schön ist das nicht. Warum genau musst du von der Liste wieder auf die verschiedenen Typen kommen!?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2079456</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2079456</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Thu, 16 Jun 2011 20:13:49 GMT</pubDate></item><item><title><![CDATA[Reply to Polymorphie in Templates on Thu, 16 Jun 2011 20:19:24 GMT]]></title><description><![CDATA[<p>Ehrlichgesagt muss ich mein Konzept nochmal genau durchdenken ob das überhaupt nötig ist. Aber selbst wenn nicht, würde mich interessieren wie man sowas macht (falls sowas geht).</p>
<p>An dieser Stelle bedanke ich mich schon mal bei allen hier <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/2079459</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2079459</guid><dc:creator><![CDATA[skNiNe]]></dc:creator><pubDate>Thu, 16 Jun 2011 20:19:24 GMT</pubDate></item><item><title><![CDATA[Reply to Polymorphie in Templates on Thu, 16 Jun 2011 20:22:12 GMT]]></title><description><![CDATA[<p>skNiNe schrieb:</p>
<blockquote>
<p>Ehrlichgesagt muss ich mein Konzept nochmal genau durchdenken ob das überhaupt nötig ist.</p>
</blockquote>
<p>Ja das dürfte ziemlich sicher dringend nötig sein.</p>
<p>skNiNe schrieb:</p>
<blockquote>
<p>Aber selbst wenn nicht, würde mich interessieren wie man sowas macht (falls sowas geht).</p>
</blockquote>
<p>Naja, prinzipiell &quot;gehts&quot; so wie du es gemacht hast: Indem man castet. Allerdings ist ein Downcast praktisch immer Symptom einens groben Designfehlers, daher sollten bei Code wie dem da oben sofort die Alarmglocken läuten...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2079460</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2079460</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Thu, 16 Jun 2011 20:22:12 GMT</pubDate></item><item><title><![CDATA[Reply to Polymorphie in Templates on Thu, 16 Jun 2011 20:43:49 GMT]]></title><description><![CDATA[<p>Aber wie ist es bspw. beim Factory-Pattern? Hier kann ja im Endeffekt nur etwas abstraktes zurück kommen. Hier müsste man ja auch eine Unterscheidung treffen (dynamic_cast) was das nun ist und wie es weiter zu behandeln ist oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2079466</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2079466</guid><dc:creator><![CDATA[skNiNe]]></dc:creator><pubDate>Thu, 16 Jun 2011 20:43:49 GMT</pubDate></item><item><title><![CDATA[Reply to Polymorphie in Templates on Thu, 16 Jun 2011 20:48:14 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">int main(int argc, char **argv) {
	Document&lt;int&gt; di(1337);
	Document&lt;char&gt; dc('c');

	std::list&lt;DocumentBase*&gt; bases;
	bases.push_back(&amp;di);
	bases.push_back(&amp;dc);

	DocumentBase *dic = bases.front();
	dic-&gt;printAt(cout);

	return 0;
}
</code></pre>
<blockquote>
<p>Aber wie ist es bspw. beim Factory-Pattern? Hier kann ja im Endeffekt nur etwas abstraktes zurück kommen. Hier müsste man ja auch eine Unterscheidung treffen (dynamic_cast) was das nun ist und wie es weiter zu behandeln ist oder?</p>
</blockquote>
<p>Wirklich?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2079470</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2079470</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 16 Jun 2011 20:48:14 GMT</pubDate></item><item><title><![CDATA[Reply to Polymorphie in Templates on Thu, 16 Jun 2011 20:52:21 GMT]]></title><description><![CDATA[<p>skNiNe schrieb:</p>
<blockquote>
<p>Aber wie ist es bspw. beim Factory-Pattern? Hier kann ja im Endeffekt nur etwas abstraktes zurück kommen. Hier müsste man ja auch eine Unterscheidung treffen (dynamic_cast) was das nun ist und wie es weiter zu behandeln ist oder?</p>
</blockquote>
<p>Es ist doch gerade der Sinn von Abstraktion dass man das nicht muss!? Du abstrahierst ja damit der restliche Code nurmehr mit dieser Abstraktion arbeiten muss ohne sich darum zu kümmern was genau es nun ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2079472</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2079472</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Thu, 16 Jun 2011 20:52:21 GMT</pubDate></item><item><title><![CDATA[Reply to Polymorphie in Templates on Thu, 16 Jun 2011 21:06:40 GMT]]></title><description><![CDATA[<p>skNiNe schrieb:</p>
<blockquote>
<p>Aber selbst wenn nicht, würde mich interessieren wie man sowas macht (falls sowas geht).</p>
</blockquote>
<p>Also generell kann man eine Wrapper-Klasse schreiben...<br />
Hier nur mal etwas Beispiel-Code, ich weiß nicht, ob es einfacher geht...</p>
<p>Aber für den Zuweisungsoperator oder Copy-Konstruktor, braucht man wohl intern einen Zeiger auf eine Klasse mit virtuellen Funktionen</p>
<p>An der Komplexität siehst du, dass es wohl eher eine theoretische Möglichkeit einer Lösung ist.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;

template&lt;typename T&gt;
class InternalVectorWrapper{
public:
	virtual ~InternalVectorWrapper(){}
	virtual InternalVectorWrapper&lt;T&gt;* copy() const = 0;
	virtual T&amp; operator[](unsigned int i) = 0;
	virtual unsigned int size() = 0;
};

template&lt;typename Type, typename TBase&gt;
class SpecificVectorWrapper : public InternalVectorWrapper&lt;TBase&gt;{
public:
	SpecificVectorWrapper(std::vector&lt;Type&gt;&amp; list) : list(list){
	}

	virtual InternalVectorWrapper&lt;TBase&gt;* copy() const {
		return new SpecificVectorWrapper&lt;Type, TBase&gt;(*this);
	}
	virtual TBase&amp; operator[](unsigned int i){
		return list[i];
	};

	virtual unsigned int size(){
		return list.size();
	}

private:
	std::vector&lt;Type&gt;&amp; list;
};

template&lt;typename TBase&gt;
class VectorWrapper{
public:
	template&lt;typename T&gt;
	VectorWrapper(std::vector&lt;T&gt;&amp; t) : ptr(new SpecificVectorWrapper&lt;T, TBase&gt;(t)){}
	~VectorWrapper(){ delete ptr; }

	VectorWrapper(const VectorWrapper&lt;TBase&gt;&amp; w){
		this-&gt;ptr = w.ptr-&gt;copy(); 
	}

	// Zuweisungsoperator implementieren...

	TBase&amp; operator[](unsigned int i){
		return ptr-&gt;operator[](i);
	}

	unsigned int size(){
		return ptr-&gt;size();
	}

protected:
	InternalVectorWrapper&lt;TBase&gt;* ptr;
};

class Fruit{
public:
	virtual ~Fruit(){}
	virtual void print_name() = 0;
};

class Banana : public Fruit{
public:	
	virtual void print_name(){
		std::cout &lt;&lt; &quot;banana&quot; &lt;&lt; std::endl;
	}
};

class Apple : public Fruit{
public:	
	virtual void print_name(){
		std::cout &lt;&lt; &quot;apple&quot; &lt;&lt; std::endl;
	}
};

class FruitBasket{
public:
	virtual VectorWrapper&lt;Fruit&gt; get_list(); 
};

class BananaBasket{
public:
	BananaBasket(){
		basket.push_back(Banana());
		basket.push_back(Banana());
	}

	virtual VectorWrapper&lt;Fruit&gt; get_list(){
		return basket;
	}

private:
	std::vector&lt;Banana&gt; basket;
};

class AppleBasket{
public:
	AppleBasket(){
		basket.push_back(Apple());
		basket.push_back(Apple());
		basket.push_back(Apple());
	}

	virtual VectorWrapper&lt;Fruit&gt; get_list(){
		return basket;
	}

private:
	std::vector&lt;Apple&gt; basket;
};

void print(VectorWrapper&lt;Fruit&gt;&amp; list){
	// Hier braucht man natürlich noch andere Funktionen in ListWrapper
	for(int i=0; i&lt; list.size(); ++i){
		list[i].print_name();
	}
}

int main(){
	AppleBasket apples;
	BananaBasket bananas;
	VectorWrapper&lt;Fruit&gt; apple_list = apples.get_list();
	VectorWrapper&lt;Fruit&gt; banana_list = bananas.get_list();
	print(apple_list);
	print(banana_list);
}
</code></pre>
<blockquote>
<p>apple<br />
apple<br />
apple<br />
banana<br />
banana</p>
</blockquote>
<p>Gruß,<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2079480</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2079480</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Thu, 16 Jun 2011 21:06:40 GMT</pubDate></item><item><title><![CDATA[Reply to Polymorphie in Templates on Thu, 16 Jun 2011 21:08:19 GMT]]></title><description><![CDATA[<p>Das weiss ich, aber es gibt trotzdem Fälle in denen man nicht drum herum kommt (soweit ich weiss).</p>
<p>Ein Fall der mir grad im Kopf rum schwirrt:<br />
Man möchte einen Instant-Messenger entwickeln. Man bekommt über Sockets serialisierte Objekte gesendet, die kann man an Hand einer Factory wieder deserialisieren und whatever damit machen. Wenn man die abstrakte Message (bspw. Datei, Nachricht oder irgendwas) dann hat, muss trotzdem unterschieden werden an Hand des genauen Typs, wie diese weiterverarbeitet werden soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2079482</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2079482</guid><dc:creator><![CDATA[skNiNe]]></dc:creator><pubDate>Thu, 16 Jun 2011 21:08:19 GMT</pubDate></item><item><title><![CDATA[Reply to Polymorphie in Templates on Thu, 16 Jun 2011 21:10:53 GMT]]></title><description><![CDATA[<p>skNiNe schrieb:</p>
<blockquote>
<p>Das weiss ich, aber es gibt trotzdem Fälle in denen man nicht drum herum kommt (soweit ich weiss).</p>
<p>Ein Fall der mir grad im Kopf rum schwirrt:<br />
Man möchte einen Instant-Messenger entwickeln. Man bekommt über Sockets serialisierte Objekte gesendet, die kann man an Hand einer Factory wieder deserialisieren und whatever damit machen. Wenn man die abstrakte Message (bspw. Datei, Nachricht oder irgendwas) dann hat, muss trotzdem unterschieden werden an Hand des genauen Typs, wie diese weiterverarbeitet werden soll.</p>
</blockquote>
<p>oder man ruft die virtuelle Methode verarbeite() auf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2079484</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2079484</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 16 Jun 2011 21:10:53 GMT</pubDate></item><item><title><![CDATA[Reply to Polymorphie in Templates on Thu, 16 Jun 2011 21:22:29 GMT]]></title><description><![CDATA[<p>Mh die Message soll tatsächlich selbst wissen wie sie verarbeitet wird? Ich finde es naheliegender wenn die Message nur ihre Daten beinhaltet und durch nen speziellen Handler verarbeitet wird (der evtl. auch die nötigen Referenzen auf andere Objekte hält die zur Verarbeitung nötig sind).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2079489</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2079489</guid><dc:creator><![CDATA[skNiNe]]></dc:creator><pubDate>Thu, 16 Jun 2011 21:22:29 GMT</pubDate></item><item><title><![CDATA[Reply to Polymorphie in Templates on Thu, 16 Jun 2011 21:32:52 GMT]]></title><description><![CDATA[<p>skNiNe schrieb:</p>
<blockquote>
<p>Mh die Message soll tatsächlich selbst wissen wie sie verarbeitet wird? Ich finde es naheliegender wenn die Message nur ihre Daten beinhaltet und durch nen speziellen Handler verarbeitet wird (der evtl. auch die nötigen Referenzen auf andere Objekte hält die zur Verarbeitung nötig sind).</p>
</blockquote>
<p>Mhmm, die Message kommt über eine Connection rein.</p>
<pre><code class="language-cpp">msg-&gt;process(&amp;connection);
</code></pre>
<p>wäre schonmal generell möglich.<br />
Und in process kann sich die Message bestimmt von der Connection auch den Nick oder die Sitzung holen, den Server oder wasauchimmer. Vielleicht.<br />
Ich halte es für überlegenswert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2079495</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2079495</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 16 Jun 2011 21:32:52 GMT</pubDate></item><item><title><![CDATA[Reply to Polymorphie in Templates on Thu, 16 Jun 2011 21:45:49 GMT]]></title><description><![CDATA[<p>Also wch will meinen Gedankengang nicht als DEN besten darstellen. Aber ich kann mcih damit nicht anfreunden, wenn in einer Message (reines Datenobjekt) irgendwelche Funktionalität implementiert wird. Da würde mir der Bezug zur Realität fehlen (was ja mit im Fokus der OOP steht). Wenn ich Post bekomme, weiss der Brief auch nicht was er nun machen muss. Davon abgesehen finde ich das Konzept der selbstverwaltung der Messages unflexibel. Es müsste eine fette Schnittstelle existieren um die nötigen Referenzen auf die Messages zu setzen bzw. zu übergeben. Was ist wenn neue Messages dazu kommen und weitere bzw. andere Informationen zusätzlich brauchen? Schnittstellenänderungen und alles hin und her usw. ... Da finde ich es persönlich sauberer einmal in einer Factory per dynamic_cast den passenden Handler für die Message zu ermitteln und die Funktionalität von der Message sauber getrennt zu haben.</p>
<p>+ Höhere Erweiterbarkeit / Flexibilität<br />
+ Sauberere Trennung</p>
<p>- Typüberprüfung zur Laufzeit</p>
<p>Da bin ich dann doch am überlegen was sinnvoller ist.</p>
<p>PS: Wie gesagt, ich will nicht meine Lösung als die beste darstellen, sondern einfach die richtigerere Lösung diskutieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2079504</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2079504</guid><dc:creator><![CDATA[skNiNe]]></dc:creator><pubDate>Thu, 16 Jun 2011 21:45:49 GMT</pubDate></item></channel></rss>