<?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[unreine, reine virtuelle Funktion]]></title><description><![CDATA[<p>Hallo, ich bin gerade dabei ein bischen C++ zu lernen als ich über eine Aufgabe gestolpert bin. Ich hoffe ihr könnt mir helfen. Mein Problem ist die invariant vererbt Funktion. Sehe ich das richtig das damit eine reine vituelle Funktion gemeint ist?</p>
<p>Definieren Sie eine abstrakte Klasse – was ist in der Klassendefinition kenntlich zu machen – die eine unreine virtuelle Funktion und eine Funktion enthält, die invariant vererbt wird?</p>
<p>Meine Lösung<br />
class Abstrakt {<br />
public:<br />
virtual void lesen(); // unreine virtuelle Funktion<br />
virtual void drucken() = 0; // reine virtuelle Funktion bzw. invariant vererbt<br />
};</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/233442/unreine-reine-virtuelle-funktion</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 22:13:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/233442.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 04 Feb 2009 18:13:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to unreine, reine virtuelle Funktion on Wed, 04 Feb 2009 18:13:03 GMT]]></title><description><![CDATA[<p>Hallo, ich bin gerade dabei ein bischen C++ zu lernen als ich über eine Aufgabe gestolpert bin. Ich hoffe ihr könnt mir helfen. Mein Problem ist die invariant vererbt Funktion. Sehe ich das richtig das damit eine reine vituelle Funktion gemeint ist?</p>
<p>Definieren Sie eine abstrakte Klasse – was ist in der Klassendefinition kenntlich zu machen – die eine unreine virtuelle Funktion und eine Funktion enthält, die invariant vererbt wird?</p>
<p>Meine Lösung<br />
class Abstrakt {<br />
public:<br />
virtual void lesen(); // unreine virtuelle Funktion<br />
virtual void drucken() = 0; // reine virtuelle Funktion bzw. invariant vererbt<br />
};</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1658048</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1658048</guid><dc:creator><![CDATA[kronosa]]></dc:creator><pubDate>Wed, 04 Feb 2009 18:13:03 GMT</pubDate></item><item><title><![CDATA[Reply to unreine, reine virtuelle Funktion on Wed, 04 Feb 2009 18:40:39 GMT]]></title><description><![CDATA[<p>Abstrakte Klasse:</p>
<pre><code class="language-cpp">class MyInterface
{
  virtual void PureVirtualMethod() = 0;
}
</code></pre>
<p>rya.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1658071</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1658071</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Wed, 04 Feb 2009 18:40:39 GMT</pubDate></item><item><title><![CDATA[Reply to unreine, reine virtuelle Funktion on Wed, 04 Feb 2009 18:52:03 GMT]]></title><description><![CDATA[<p>ühm, ja, genau.</p>
<p>Eine abstrakte Klasse... entnehme ich deiner antwort Richtig das ich bei meiner Lösung das public: raus machen und das ; am ende der Klasse entfernen soll?</p>
<p>Dann bliebe nur noch die Frage offen ist eine invariant vererbt Funktion das gleiche wie eine reine vituelle Funktion?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1658084</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1658084</guid><dc:creator><![CDATA[kronosa]]></dc:creator><pubDate>Wed, 04 Feb 2009 18:52:03 GMT</pubDate></item><item><title><![CDATA[Reply to unreine, reine virtuelle Funktion on Wed, 04 Feb 2009 18:55:33 GMT]]></title><description><![CDATA[<p>kronosa schrieb:</p>
<blockquote>
<p>Eine abstrakte Klasse... entnehme ich deiner antwort Richtig das ich bei meiner Lösung das public: raus machen und das ; am ende der Klasse entfernen soll?</p>
<p>Dann bliebe nur noch die Frage offen ist eine invariant vererbt Funktion das gleiche wie eine reine vituelle Funktion?</p>
</blockquote>
<p>Nö. Deines passt schon.<br />
Invariant vererbt Funktion hätte ich jetzt noch nie gehört, aber wenn ich es richtig verstehe, ist dein Beispiel richtig. Da der eigentliche Code, der die Funktion ausführt nicht in der Klasse selbst definiert ist. Somit ist die Invariante bei einer abeleiteten Klasse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1658088</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1658088</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 04 Feb 2009 18:55:33 GMT</pubDate></item><item><title><![CDATA[Reply to unreine, reine virtuelle Funktion on Thu, 05 Feb 2009 09:42:56 GMT]]></title><description><![CDATA[<p>kronosa schrieb:</p>
<blockquote>
<p>Hallo, ich bin gerade dabei ein bischen C++ zu lernen als ich über eine Aufgabe gestolpert bin. Ich hoffe ihr könnt mir helfen. Mein Problem ist die invariant vererbt Funktion. Sehe ich das richtig das damit eine reine vituelle Funktion gemeint ist?</p>
</blockquote>
<p>Nein, invariante Funktionen sind eben invariant, also über die komplette Vererbungshierarchie unveränderlich. Das ist das genaue Gegenteil von (rein) virtuellen Funktionen, die sich ja polymorph ändern können.</p>
<p>kronosa schrieb:</p>
<blockquote>
<p>Definieren Sie eine abstrakte Klasse – was ist in der Klassendefinition kenntlich zu machen – die eine unreine virtuelle Funktion und eine Funktion enthält, die invariant vererbt wird?</p>
</blockquote>
<p>Das würde dann z.B. so aussehen:</p>
<pre><code class="language-cpp">class SomeClass
{
    virtual void pureVirtuel() = 0; //rein virtuelle Funktion

    virtual void justVirtual(){/*do something here*/} //virtuelle Funktion

    void invariant(){/*do something here*/}//invariante Funktion
};
</code></pre>
<p>Die invarianten Funktionen werden also einfach von erbenden Funktionen aus der Basisklasse übernommenm und <em>dürfen</em> nicht reimplementiert werden.<br />
Oder genauer:</p>
<ul>
<li>Bei rein virtuellen Funktionen wird nur das Interface einer Funktion vererbt (also wie die Funktion aufgerufen wird).</li>
<li>Bei virtuellen Funktionen wird das Interface und eine lose gekoppelte Standard-Implementierung vererbt. Die Standardimplementierung darf aber später von erbenden Funktionen geändert werden.</li>
<li>Bei invarianten Funktionen wird die Implementierung fest gekoppelt an das Interface vererbt. Diese darf von abgeleiteten Klassen nicht geändert werden. Deher ist sie eben invariant.</li>
</ul>
]]></description><link>https://www.c-plusplus.net/forum/post/1658296</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1658296</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Thu, 05 Feb 2009 09:42:56 GMT</pubDate></item><item><title><![CDATA[Reply to unreine, reine virtuelle Funktion on Thu, 05 Feb 2009 12:25:37 GMT]]></title><description><![CDATA[<p>Wow, super Erklärung Tachyon, danke. Das werd ich mir jetzt genau so als Beispiel aufschreiben. Die drei Merksätze sind gut.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1658445</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1658445</guid><dc:creator><![CDATA[kronosa]]></dc:creator><pubDate>Thu, 05 Feb 2009 12:25:37 GMT</pubDate></item><item><title><![CDATA[Reply to unreine, reine virtuelle Funktion on Thu, 05 Feb 2009 12:55:24 GMT]]></title><description><![CDATA[<p>Was Tachyon nicht erwähnt hat:<br />
Die invarianten Funktionen können von abgeleiteten Klassen durchaus überschrieben werden, so dass ein Aufruf über einen Pointer/Referenz auf die abgeleitete Klasse auch die Funktion in der abgeleiteten Klasse aufruft. Ein Aufruf über den Basisklassenpointer wird aber immer die Basisklassenfunktion aufrufen, da bei nichtvirtuellen Funktionen der statische Typ des Objekts (also des Pointers) entscheidend ist.<br />
Ich verdeutliche das mal an nem Beispiel:</p>
<pre><code class="language-cpp">struct Base 
{
  void invariantFunc() {cout &lt;&lt; &quot;base:invariant&quot; &lt;&lt; endl;}
  virtual void virtualFunc() {cout &lt;&lt; &quot;base::virtual&quot; &lt;&lt; endl;}
};

struct Derived : public Base
{
  void invariantFunc() {cout &lt;&lt; &quot;derived:invariant&quot; &lt;&lt; endl;} //überschreibt base::invariantFunc
  virtual void virtualFunc() {cout &lt;&lt; &quot;derived::virtual&quot; &lt;&lt; endl;}
};

int main()
{
  Base b;
  Derived d;

  Base* pb1 = &amp;b;  //statischer und dynamischer Typ ist Base
  Base* pb2 = &amp;d;  //statischer Typ ist Base, dynamischer Typ Derived
  Derived* pd = &amp;d; //statischer und dynamischer Typ ist Derived

  pb1-&gt;virtualFunc();    //base::virtual , dynamischer Typ zählt
  pb1-&gt;invariantFunc();  //base::invariant , statischer Typ zählt
  pb2-&gt;virtualFunc();    //derived::virtual , dynamischer Typ zählt
  pb2-&gt;invariantFunc();  //base::invariant , statischer Typ zählt
  pd-&gt;virtualFunc();    //derived::virtual , dynamischer Typ zählt
  pd-&gt;invariantFunc();  //derived::invariant , statischer Typ zählt
}
</code></pre>
<p>Alle Klarheiten beseitigt? <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/1658460</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1658460</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 05 Feb 2009 12:55:24 GMT</pubDate></item><item><title><![CDATA[Reply to unreine, reine virtuelle Funktion on Thu, 05 Feb 2009 14:51:06 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Was Tachyon nicht erwähnt hat:[...]</p>
</blockquote>
<p>Ich habs bewusst weggelassen, weil man das eigentlich tunlichst vermeiden sollte und es nicht zur Beantwortung der Frage beiträgt. Im Normalfall ist das ein Designfehler, der einem die &quot;Is-A&quot;-Beziehung zerschrottet, und Verhalten auslöst, dass man nicht erwartet hätte. Mal davon abgesehen, ist das im Kontext der Aufgabe auch völliger Unsinn. Wenn die abgeleitete Klasse eine invariante Funktion wirklich anders implementieren muss, dann ist sie wohl nicht so wirklich invariant, oder? <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="😉"
    /><br />
Genaugenommen ist das sogar eine Sache, die man nie benötigt. Da man eh immer Qualifizieren muss, kann man der Funktion in der abgeleiteten Klasse ebensogut einen anderen Namen geben.</p>
<p>pumuckl schrieb:</p>
<blockquote>
<p>[...]Alle Klarheiten beseitigt? <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>
</blockquote>
<p>Das ist allerdings wahr...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1658515</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1658515</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Thu, 05 Feb 2009 14:51:06 GMT</pubDate></item></channel></rss>