<?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[Problem mit virtuellen Funktionen]]></title><description><![CDATA[<p>Hallo ich habe folgendes Problem:</p>
<pre><code class="language-cpp">class DataBase; // forward (abstract class)

class ConcreteData : public DataBase;
//Rest ist mal weggellassen...

class Base
{
...
public:
  void setData(DataBase&amp; data) = 0;
...
};

class Derived : public base
{
public:
  void setData(ConcreteData&amp; aData) { data = aData; }
private:
  ConcreteData data;
}
</code></pre>
<p>Alleine bei diesem Beispiel meckert der compiler (<a href="http://vc.net" rel="nofollow">vc.net</a> 2003), dass die rein virtuelle Methode setData nicht implementiert ist.<br />
Ich könnte anstelle von ConcreteData&amp; auch DataBase&amp; verwenden. Dann muesste ich allerdings einen =operator schreiben der DataBase&amp; als Parameter nimmt.<br />
Stehe gerade auf dem Schlauch...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/129533/problem-mit-virtuellen-funktionen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 06:06:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/129533.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 14 Dec 2005 13:24:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit virtuellen Funktionen on Wed, 14 Dec 2005 13:24:42 GMT]]></title><description><![CDATA[<p>Hallo ich habe folgendes Problem:</p>
<pre><code class="language-cpp">class DataBase; // forward (abstract class)

class ConcreteData : public DataBase;
//Rest ist mal weggellassen...

class Base
{
...
public:
  void setData(DataBase&amp; data) = 0;
...
};

class Derived : public base
{
public:
  void setData(ConcreteData&amp; aData) { data = aData; }
private:
  ConcreteData data;
}
</code></pre>
<p>Alleine bei diesem Beispiel meckert der compiler (<a href="http://vc.net" rel="nofollow">vc.net</a> 2003), dass die rein virtuelle Methode setData nicht implementiert ist.<br />
Ich könnte anstelle von ConcreteData&amp; auch DataBase&amp; verwenden. Dann muesste ich allerdings einen =operator schreiben der DataBase&amp; als Parameter nimmt.<br />
Stehe gerade auf dem Schlauch...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/941948</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941948</guid><dc:creator><![CDATA[templäd]]></dc:creator><pubDate>Wed, 14 Dec 2005 13:24:42 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit virtuellen Funktionen on Wed, 14 Dec 2005 13:32:33 GMT]]></title><description><![CDATA[<p>Hallo,<br />
C++ unterstützt nur kovariante Rückgabewerte nicht aber kovariante Parameter. Um eine virtuelle Methode zu überschreiben musst du also identische Parameter-Typen angeben. In deinem Fall also DataBase.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/941962</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941962</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Wed, 14 Dec 2005 13:32:33 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit virtuellen Funktionen on Wed, 14 Dec 2005 13:36:41 GMT]]></title><description><![CDATA[<p>Desweiteren hat die Basisklasse kein einziges virtuelles Mitglied, womit die Klassen nichtmal polymorphisch sind...</p>
<p>(Mach dir nix draus bin ich selbst erst kürzlich übel drauf reingefallen :D)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/941971</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941971</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 14 Dec 2005 13:36:41 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit virtuellen Funktionen on Wed, 14 Dec 2005 13:39:53 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Desweiteren hat die Basisklasse kein einziges virtuelles Mitglied, womit die Klassen nichtmal polymorphisch sind...</p>
</blockquote>
<p>Was heißt virtuelles Mitglied und was hat es für folgen, dass sie nicht Polymorphisch sind?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/941976</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941976</guid><dc:creator><![CDATA[templäd]]></dc:creator><pubDate>Wed, 14 Dec 2005 13:39:53 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit virtuellen Funktionen on Wed, 14 Dec 2005 13:47:17 GMT]]></title><description><![CDATA[<p>Polymorphie macht es überhaupt erst möglich dass die Funktion der abgeleiteten Klasse verwendet wird wenn der Typ des Objekts von der abgeleiteten Klasse ist. Der Sinn ist ja, dass ich auf ein Base&amp; (welches in Wirklichkeit ein Objekt vom Typ Derived ist) die Methode setData aufrufen kann, tatsächlich aber die Methode Derived::setData genutzt wird.</p>
<p>Demnach macht</p>
<pre><code class="language-cpp">void setData(DataBase&amp; data) = 0;
</code></pre>
<p>keinen Sinn, denn: Abstrakt, d.h. ein Aufruf dieser Methode würde zur Laufzeit einen Fehler geben &quot;pure virtual called&quot; und Nichtvirtuell, d.h. es wird beim Aufruf dieser Methode keine abgeleitete Klasse herangezogen -&gt; Widerspruch also Fehler <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>
<pre><code class="language-cpp">virtual void setData(DataBase&amp; data) = 0;
</code></pre>
<p>In der Ableitung steht es Dir frei, virtual hinzuschreiben oder wegzulassen, da virtual sich eh vererbt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/941988</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941988</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 14 Dec 2005 13:47:17 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit virtuellen Funktionen on Wed, 14 Dec 2005 13:56:33 GMT]]></title><description><![CDATA[<p>Danke</p>
<pre><code class="language-cpp">virtual
</code></pre>
<p>sollte man benutzen. Bin schon blind.<br />
Jetzt hab ich den setter so gemacht.</p>
<pre><code class="language-cpp">class DataBase; // forward (abstract class)

class ConcreteData : public DataBase;
//Rest ist mal weggellassen...

class Base
{
...
public:
  void setData(const DataBase&amp; data) = 0;
  AddressAC&amp; getData() const;
...
};

class Derived : public base
{
public:
  void setData(const DataBase&amp; aData) { setData(static_cast&lt;const ConcreteData&amp;&gt;(aData)); }
  void setData(ConcreteData&amp; aData) { data = aData; }
  ConcreteData &amp;getData() const { return data; }
private:
  ConcreteData data;
}
</code></pre>
<p>Jetzt sieht man auch den Unterschied schön kovarianter Rückgabewert/Paramter. Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/942001</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/942001</guid><dc:creator><![CDATA[templäd]]></dc:creator><pubDate>Wed, 14 Dec 2005 13:56:33 GMT</pubDate></item></channel></rss>