<?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[Implementierung rein-virtueller Methode mit Template-Parameter]]></title><description><![CDATA[<p>Bin von Java nach C++ umgestiegen und arbeite mich gerade neu in die OOP-Vererbung und Polymorphie ein.<br />
Habe folgendes Problem :<br />
Zwei Objekte sollen addiert werden.<br />
der + Operator soll in einer virtuellen Basisklasse , welche<br />
nur als gemeinsame Containerschnittstelle dient,als virtual deklariert werden.<br />
Die Signatur von der Subklassenimplementierung der virtuellen Methode<br />
wird allerdings vom Compliler offenbar nicht als &quot;kompatibel&quot; angesehen.<br />
Wie bekomme ich dieses einfache Beispiel zum laufen ?<br />
Bedingung soll sein dass die Basisklasse rein virtuell ist und den +Operator weiterhin als Schnittstelle definiert , der Operator allerdings in abgeleiteten Klassen nur eine Schnittstelle mit dem Typ der abgeleiteten Klasse bereitstellt.<br />
Danke für im Vorraus für eure Zeit.<br />
-------------------------------------------------------------------------<br />
template &lt;class T&gt;<br />
class Koordinate{<br />
public:<br />
virtual Koordinate&lt;T&gt; operator+(Koordinate&lt;T&gt;&amp; )=0;<br />
};</p>
<p>template &lt;class T&gt;<br />
class Koordinate2D : public Koordinate&lt;T&gt;{<br />
public:<br />
void operator+(Koordinate2D&lt;T&gt;&amp; K){;}<br />
};</p>
<p>int main (int argc, char *argv[])<br />
{<br />
Koordinate2D&lt;double&gt; p1(1,2) ;<br />
}<br />
----------------------------------------------------------------------<br />
folgende Fehlermeldung(Visual Studio)<br />
Instanz von abstrakter Klasse kann nicht erstellt werden<br />
1&gt; with<br />
1&gt; [<br />
1&gt; T=double<br />
1&gt; ]<br />
1&gt; aufgrund folgender Member:<br />
1&gt; &quot;void Koordinate&lt;T&gt;::add(Koordinate&lt;T&gt; &amp;)&quot;: ist abstrakt<br />
1&gt; with<br />
1&gt; [<br />
1&gt; T=double<br />
1&gt; ]</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/275947/implementierung-rein-virtueller-methode-mit-template-parameter</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 14:36:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/275947.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 23 Oct 2010 19:36:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Implementierung rein-virtueller Methode mit Template-Parameter on Sat, 23 Oct 2010 19:40:46 GMT]]></title><description><![CDATA[<p>Bin von Java nach C++ umgestiegen und arbeite mich gerade neu in die OOP-Vererbung und Polymorphie ein.<br />
Habe folgendes Problem :<br />
Zwei Objekte sollen addiert werden.<br />
der + Operator soll in einer virtuellen Basisklasse , welche<br />
nur als gemeinsame Containerschnittstelle dient,als virtual deklariert werden.<br />
Die Signatur von der Subklassenimplementierung der virtuellen Methode<br />
wird allerdings vom Compliler offenbar nicht als &quot;kompatibel&quot; angesehen.<br />
Wie bekomme ich dieses einfache Beispiel zum laufen ?<br />
Bedingung soll sein dass die Basisklasse rein virtuell ist und den +Operator weiterhin als Schnittstelle definiert , der Operator allerdings in abgeleiteten Klassen nur eine Schnittstelle mit dem Typ der abgeleiteten Klasse bereitstellt.<br />
Danke für im Vorraus für eure Zeit.<br />
-------------------------------------------------------------------------<br />
template &lt;class T&gt;<br />
class Koordinate{<br />
public:<br />
virtual Koordinate&lt;T&gt; operator+(Koordinate&lt;T&gt;&amp; )=0;<br />
};</p>
<p>template &lt;class T&gt;<br />
class Koordinate2D : public Koordinate&lt;T&gt;{<br />
public:<br />
void operator+(Koordinate2D&lt;T&gt;&amp; K){;}<br />
};</p>
<p>int main (int argc, char *argv[])<br />
{<br />
Koordinate2D&lt;double&gt; p1(1,2) ;<br />
}<br />
----------------------------------------------------------------------<br />
folgende Fehlermeldung(Visual Studio)<br />
Instanz von abstrakter Klasse kann nicht erstellt werden<br />
1&gt; with<br />
1&gt; [<br />
1&gt; T=double<br />
1&gt; ]<br />
1&gt; aufgrund folgender Member:<br />
1&gt; &quot;void Koordinate&lt;T&gt;::add(Koordinate&lt;T&gt; &amp;)&quot;: ist abstrakt<br />
1&gt; with<br />
1&gt; [<br />
1&gt; T=double<br />
1&gt; ]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1969721</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1969721</guid><dc:creator><![CDATA[JohnnyDoe]]></dc:creator><pubDate>Sat, 23 Oct 2010 19:40:46 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung rein-virtueller Methode mit Template-Parameter on Sat, 23 Oct 2010 20:05:09 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>operator+ in wird nur überschrieben, wenn er die gleiche Signatur wie in der Basisklasse hat. Schau nochmal genau hin: das Argument ist einmal Koordinate und einmal Koordinate2D. Du könntest als Parameter einen Zeiger auf Koordinate übergeben und dann innerhalb von operator+ hochcasten, das sollte gehen. Ob das aber sinnvoll ist und ob es überhaupt sinnvoll ist operator+ als Schnittstelle zu definieren, das müssen dir andere sagen. Ich denke eher nein. Stattdessen würde ich jeder abgeleiteten Klasse eine friend-Methode operator+ spendieren...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1969740</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1969740</guid><dc:creator><![CDATA[Brille_ Filmann]]></dc:creator><pubDate>Sat, 23 Oct 2010 20:05:09 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung rein-virtueller Methode mit Template-Parameter on Sat, 23 Oct 2010 21:54:15 GMT]]></title><description><![CDATA[<p>Dein Fehlermeldung hat nix mit dem Operator zu tun <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1969781</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1969781</guid><dc:creator><![CDATA[Zeus]]></dc:creator><pubDate>Sat, 23 Oct 2010 21:54:15 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung rein-virtueller Methode mit Template-Parameter on Sun, 24 Oct 2010 13:18:39 GMT]]></title><description><![CDATA[<p>Danke für die schnelle Antwort...<br />
....ja ich weiß , das Beispiel ist nicht besonders sinnvoll , da es die Schnittstelle der + Methode aufweichen würde und dann verschieden dimensionierte Koordinaten (z.B abgeleitete Koordinaten mit höherer Dimension) über die Metodenschnittstelle addiert werden könnten was unter Umständen blödsinn ist,dennoch würden diese ja über die Methoden-Schnittstelle heruntergecastet und zumindest würde kein undefiniertes Zeugs entstehen.Da ich ja am Üben bin habe ich mir trotzdem die Frage gestellt wieso der Compiler hier meckert.<br />
Gelten als Signatur bei zu implementierenden virtuellen Methoden in Subklassen nicht auch &quot;kompatible&quot; Paramter , also z.B SubTypen der MethodenParamter der virtuellen Methode ? Hab sowas ähnliches mal in nem Buch gelesen glaub ich , bin mir aber nicht mehr sicher auf welche Teile der Signatur das bezogen war...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1969941</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1969941</guid><dc:creator><![CDATA[JohnnyDoe]]></dc:creator><pubDate>Sun, 24 Oct 2010 13:18:39 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung rein-virtueller Methode mit Template-Parameter on Sun, 24 Oct 2010 13:25:35 GMT]]></title><description><![CDATA[<p>Bei Rückgabewerten von virtuellen Funktionen darf statt (eines Zeigers/Referenz) der Basisklasse auch eine abgeleitete Klasse als Typ zurückgegeben werden (besonders sinnvoll für Factory-Methoden), z.B.</p>
<pre><code class="language-cpp">class Base
{
public:
  Base* Create() = 0;
};

class Derived : Base
[
public:
  Derived* Create() { return new Derived(); }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1969953</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1969953</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Sun, 24 Oct 2010 13:25:35 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung rein-virtueller Methode mit Template-Parameter on Sun, 24 Oct 2010 18:15:13 GMT]]></title><description><![CDATA[<p>JohnnyDoe schrieb:</p>
<blockquote>
<p>Gelten als Signatur bei zu implementierenden virtuellen Methoden in Subklassen nicht auch &quot;kompatible&quot; Paramter , also z.B SubTypen der MethodenParamter der virtuellen Methode ? Hab sowas ähnliches mal in nem Buch gelesen glaub ich , bin mir aber nicht mehr sicher auf welche Teile der Signatur das bezogen war...</p>
</blockquote>
<p>Du musst eine rein virtuelle Methode so überschreiben, wie sie in der Basisklasse deklariert ist. Schließlich kann es ja sein, dass du Koordinate2D&lt;T&gt;::operator+(Koordinate&lt;T&gt;&amp;) und Koordinate2D&lt;T&gt;::operator+(Koordinate<strong>2D</strong>&lt;T&gt;&amp;) verschieden implementieren willst. Was du meinst ist eher, dass bspw. so ein Aufruf gültig ist:</p>
<pre><code class="language-cpp">void compute(B* b);

class B
{
};

class D : public B
{
};

int main()
{
    D* d = new D();
    compute(d);
}
</code></pre>
<p>Hier wäre D ein kompatibler Typ weil er von B abgeleitet ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1970087</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1970087</guid><dc:creator><![CDATA[Brille - Filmann]]></dc:creator><pubDate>Sun, 24 Oct 2010 18:15:13 GMT</pubDate></item></channel></rss>