<?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[pure virtual functions und Vererbung]]></title><description><![CDATA[<p>Hallo,</p>
<p>komme irgendwie nicht weiter, daher Frage in die Runde.<br />
Ich möchte ähnliche Typen in einen Container packen und wählte dazu eine<br />
abstrakte Basisklasse.<br />
Die virtuelle Methode soll einen bestimmten Typ (abhängig von der Templateinstanziierung der abgeleiteten Klasse) zurückgeben.<br />
Wie macht man das am Besten?</p>
<p>Danke.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;
#include &lt;memory&gt;

template &lt;typename T&gt;
struct Foo
{
 T m_value;
 Foo(T value) : m_value(value) {}
};

class Base
{
 public:
 virtual int getValue()=0; //Problem: Rückgabetyp ist auf int beschränkt
 virtual ~Base() {}
};

template &lt;typename T&gt;
class Derived: public Base
{
 private:
 Foo&lt;T&gt; value;
 public:
 Derived(T val) : value(Foo&lt;T&gt;(val)) {}
 T getValue() { return value.m_value;}
};

int main()
{
 std::vector&lt;std::unique_ptr&lt;Base&gt;&gt; my_vector;
 my_vector.push_back(std::unique_ptr&lt;Base&gt;(new Derived&lt;int&gt;(5)));
 my_vector.push_back(std::unique_ptr&lt;Base&gt;(new Derived&lt;int&gt;(10)));
 //my_vector.push_back(std::unique_ptr&lt;Base&gt;(new Derived&lt;std::string&gt;(&quot;Hallo Welt&quot;))); //ist nicht möglich
 for(auto &amp; item : my_vector)
 {
  std::cout &lt;&lt; item-&gt;getValue() &lt;&lt; '\n';
 }
 return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/299450/pure-virtual-functions-und-vererbung</link><generator>RSS for Node</generator><lastBuildDate>Thu, 13 Aug 2026 06:12:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/299450.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 11 Feb 2012 12:13:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to pure virtual functions und Vererbung on Sat, 11 Feb 2012 12:13:18 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>komme irgendwie nicht weiter, daher Frage in die Runde.<br />
Ich möchte ähnliche Typen in einen Container packen und wählte dazu eine<br />
abstrakte Basisklasse.<br />
Die virtuelle Methode soll einen bestimmten Typ (abhängig von der Templateinstanziierung der abgeleiteten Klasse) zurückgeben.<br />
Wie macht man das am Besten?</p>
<p>Danke.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;
#include &lt;memory&gt;

template &lt;typename T&gt;
struct Foo
{
 T m_value;
 Foo(T value) : m_value(value) {}
};

class Base
{
 public:
 virtual int getValue()=0; //Problem: Rückgabetyp ist auf int beschränkt
 virtual ~Base() {}
};

template &lt;typename T&gt;
class Derived: public Base
{
 private:
 Foo&lt;T&gt; value;
 public:
 Derived(T val) : value(Foo&lt;T&gt;(val)) {}
 T getValue() { return value.m_value;}
};

int main()
{
 std::vector&lt;std::unique_ptr&lt;Base&gt;&gt; my_vector;
 my_vector.push_back(std::unique_ptr&lt;Base&gt;(new Derived&lt;int&gt;(5)));
 my_vector.push_back(std::unique_ptr&lt;Base&gt;(new Derived&lt;int&gt;(10)));
 //my_vector.push_back(std::unique_ptr&lt;Base&gt;(new Derived&lt;std::string&gt;(&quot;Hallo Welt&quot;))); //ist nicht möglich
 for(auto &amp; item : my_vector)
 {
  std::cout &lt;&lt; item-&gt;getValue() &lt;&lt; '\n';
 }
 return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2179764</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2179764</guid><dc:creator><![CDATA[einwurf]]></dc:creator><pubDate>Sat, 11 Feb 2012 12:13:18 GMT</pubDate></item><item><title><![CDATA[Reply to pure virtual functions und Vererbung on Sat, 11 Feb 2012 12:35:07 GMT]]></title><description><![CDATA[<p>Bei Funktionsüberladung kannst Du nicht einfach den Rückgabetyp ändern.</p>
<p>Du kannst einen std::string mit dem Typnamen zurückgeben oder type_info.</p>
<p>Wofür brauchst Du den type denn? Gut möglich, dass ein Designproblem im übergeordneten Kontext steht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2179773</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2179773</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Sat, 11 Feb 2012 12:35:07 GMT</pubDate></item><item><title><![CDATA[Reply to pure virtual functions und Vererbung on Sat, 11 Feb 2012 13:24:24 GMT]]></title><description><![CDATA[<blockquote>
<p>Die virtuelle Methode soll einen bestimmten Typ (abhängig von der Templateinstanziierung der abgeleiteten Klasse) zurückgeben.</p>
</blockquote>
<p>Das ist nicht moeglich mit C++ (und insgesamt auch nicht sinnvoll).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2179784</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2179784</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Sat, 11 Feb 2012 13:24:24 GMT</pubDate></item><item><title><![CDATA[Reply to pure virtual functions und Vererbung on Sat, 11 Feb 2012 13:54:31 GMT]]></title><description><![CDATA[<p>Geht das nicht mit <code>boost::any</code> , <code>boost::variant</code> ? Und selbst dann schweifst du in unnötiges Land ab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2179791</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2179791</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 11 Feb 2012 13:54:31 GMT</pubDate></item><item><title><![CDATA[Reply to pure virtual functions und Vererbung on Sat, 11 Feb 2012 13:56:03 GMT]]></title><description><![CDATA[<p>Naja, möglich ist es schon, indem du eine gemeinsame Basisklasse für alle möglichen Rückgabetypen einführst. Denn Folgendes ist erlaubt:</p>
<pre><code class="language-cpp">struct Base
{
	virtual Base&amp; get();
};

struct Derived : public Base
{
	virtual Derived&amp; get();
};
</code></pre>
<p>Aber ich habe meine Zweifel, dass du mit komplett generischen Rückgabewerten überhaupt was anfangen kannst. Was willst du denn mit ihnen machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2179792</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2179792</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Sat, 11 Feb 2012 13:56:03 GMT</pubDate></item><item><title><![CDATA[Reply to pure virtual functions und Vererbung on Sat, 11 Feb 2012 22:38:38 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>danke für die Antworten.</p>
<p>Um mal ganz grob meine Intention zu veranschaulichen.<br />
Eine Funktion erhält als Argumente verschiedene aufrufbare Einheiten,<br />
welche in einem Container gespeichert werden. Danach iteriere ich über den<br />
Container und anschließend werden die Resultate der aufrufbaren Einheiten an eine weitere Funktion übergeben.Das ganze soll eben sehr generisch sein.<br />
Eventuell ist std::tuple eine Option, muss ich mir aber noch genauer anschauen. Boost kann ich an dieser Stelle nicht verwenden.</p>
<pre><code class="language-cpp">void foo(int a, int b, std::string c);

template&lt;typename T1, typename T2, typename t3&gt;
void fun2(T1 fun1, T2 fun2, T3 fun3)
{
  std::vector&lt;std::unique_ptr&lt;Base&gt;&gt; myfuns;
  myfuns.push_back(std::unique_ptr&lt;Base&gt;(new Derived&lt;decltype(fun1())&gt;(fun1)));
  myfuns.push_back(std::unique_ptr&lt;Base&gt;(new Derived&lt;decltype(fun2())&gt;(fun2)));
  myfuns.push_back(std::unique_ptr&lt;Base&gt;(new Derived&lt;decltype(fun3())&gt;(fun3)));
  //loop myfuns and do s.th.
  //...
  foo(myfuns[0]-&gt;getResult(),myfuns[1]-&gt;getResult(),myfuns[2]-&gt;getResult());   //das ist das Ziel
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2179967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2179967</guid><dc:creator><![CDATA[einwurf]]></dc:creator><pubDate>Sat, 11 Feb 2012 22:38:38 GMT</pubDate></item><item><title><![CDATA[Reply to pure virtual functions und Vererbung on Sat, 11 Feb 2012 22:55:38 GMT]]></title><description><![CDATA[<p>Sind foo die Parametertypen egal oder müssen die dann wiederum bestimmten Kriterien entsprechen? Ein anderer Ansatz wäre, dass du den Derived-Objekten einen Zeiger auf foo gibst und die Objekte dann selbst foo aufrufen. Schau dir auch mal das Visitor-Pattern an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2179973</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2179973</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Sat, 11 Feb 2012 22:55:38 GMT</pubDate></item><item><title><![CDATA[Reply to pure virtual functions und Vererbung on Sun, 12 Feb 2012 10:07:27 GMT]]></title><description><![CDATA[<blockquote>
<p>Das ganze soll eben sehr generisch sein</p>
</blockquote>
<p>Nichts ist generischer als ein void-Pointer. Die Frage bleibt aber: Warum soll es sehr generisch sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2180026</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2180026</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Sun, 12 Feb 2012 10:07:27 GMT</pubDate></item><item><title><![CDATA[Reply to pure virtual functions und Vererbung on Sun, 12 Feb 2012 11:26:42 GMT]]></title><description><![CDATA[<p>Ich habe es jetzt mit std::tuple gelöst, ohne Vererbung.<br />
Es soll so generisch sein, weil ich die Methode mit den unterschiedlichsten Funktionen wiederverwenden möchte.<br />
void-Pointer sind nicht so mein Ding. <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>Danke nochmal für eure Mühe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2180065</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2180065</guid><dc:creator><![CDATA[einwurf]]></dc:creator><pubDate>Sun, 12 Feb 2012 11:26:42 GMT</pubDate></item></channel></rss>