<?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[virtuelle Methoden]]></title><description><![CDATA[<p>Hallo,</p>
<p>bei virtuellen Methoden gibt es ja folgende Möglichkeiten:</p>
<pre><code class="language-cpp">1: virtual void foo() = 0;
2: virtual void foo() { ... }
3: virtual void foo() = 0 { ... }
4: virtual void foo();
</code></pre>
<p>Könntet ihr mir sagen ob folgende Aussagen stimmen:<br />
Bei 1) MUSS die Subklasse überschreiben (sonst ist sie selber abstrakt)</p>
<p>Bei 2) KANN die Subklasse überschreiben. Die Subklasse kann hier Funktionalität der Basisklasse nutzen</p>
<p>Bei 3) MUSS die Subklasse überschreiben UND kann Funktionalität der Basisklasse nutzen.</p>
<p>Geht 4) überhaupt? Ich seh da keinen Sinn drinnen, eine Methode als virtuell zu deklarieren aber sie nicht zu definieren. Geht das?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/287444/virtuelle-methoden</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 10:25:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/287444.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 28 May 2011 17:36:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to virtuelle Methoden on Sat, 28 May 2011 17:36:16 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>bei virtuellen Methoden gibt es ja folgende Möglichkeiten:</p>
<pre><code class="language-cpp">1: virtual void foo() = 0;
2: virtual void foo() { ... }
3: virtual void foo() = 0 { ... }
4: virtual void foo();
</code></pre>
<p>Könntet ihr mir sagen ob folgende Aussagen stimmen:<br />
Bei 1) MUSS die Subklasse überschreiben (sonst ist sie selber abstrakt)</p>
<p>Bei 2) KANN die Subklasse überschreiben. Die Subklasse kann hier Funktionalität der Basisklasse nutzen</p>
<p>Bei 3) MUSS die Subklasse überschreiben UND kann Funktionalität der Basisklasse nutzen.</p>
<p>Geht 4) überhaupt? Ich seh da keinen Sinn drinnen, eine Methode als virtuell zu deklarieren aber sie nicht zu definieren. Geht das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2070198</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2070198</guid><dc:creator><![CDATA[ChampionsLeagueFinale]]></dc:creator><pubDate>Sat, 28 May 2011 17:36:16 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Methoden on Sat, 28 May 2011 17:43:03 GMT]]></title><description><![CDATA[<p>ChampionsLeagueFinale schrieb:</p>
<blockquote>
<p>Geht 4) überhaupt?</p>
</blockquote>
<p>Ja. Es passiert das Selbe, wie bei jeder anderen undefinierten Funktion.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2070202</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2070202</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Sat, 28 May 2011 17:43:03 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Methoden on Sat, 28 May 2011 17:49:18 GMT]]></title><description><![CDATA[<p>Version 2 und 4 sind technisch gesehen das selbe, nur daß bei der letzten Variante noch eine Definition der (eigenen) Methode dazukommen muß.</p>
<p>(btw, ich wußte bisher nicht, daß Version 3 vom Standard abgesegnet ist)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2070203</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2070203</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 28 May 2011 17:49:18 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Methoden on Sat, 28 May 2011 19:54:10 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Version 2 und 4 sind technisch gesehen das selbe, nur daß bei der letzten Variante noch eine Definition der (eigenen) Methode dazukommen muß.</p>
<p>(btw, ich wußte bisher nicht, daß Version 3 vom Standard abgesegnet ist)</p>
</blockquote>
<p>Ist auch nicht, weder im Aktuellen noch im Kommenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2070230</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2070230</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 28 May 2011 19:54:10 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Methoden on Sun, 29 May 2011 10:39:30 GMT]]></title><description><![CDATA[<p>edit: Frage hat sich geklärt.<br />
Zusammengefasste Erkenntnis:<br />
- Funktionen dürfen nicht gleichzeitig pur virtuell deklariert UND definiert werden. (zweite Note zu §10.4,2) D.h.</p>
<pre><code class="language-cpp">struct B {
  virtual void foo() = 0
  {} //Verboten!
};
</code></pre>
<p>- Pur virtuelle Funktionen dürfen aber durchaus an anderer Stelle eine Definition haben. Bei Destruktoren ist das sogar zwingend notwendig. Folgende Möglichkeiten ergeben sich dafür:</p>
<p>Möglichkeit 1:</p>
<pre><code class="language-cpp">//b.h
struct B {
  virtual ~B() = 0;
};

//b.cpp
B::~B() {/* ... */}
</code></pre>
<p>Möglichkeit 2:</p>
<pre><code class="language-cpp">//b.h
struct B {
  virtual ~B() = 0;
};

inline B::~B() {/* ... */}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2070389</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2070389</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Sun, 29 May 2011 10:39:30 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Methoden on Sun, 29 May 2011 10:32:12 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>CStoll schrieb:</p>
<blockquote>
<p>Version 2 und 4 sind technisch gesehen das selbe, nur daß bei der letzten Variante noch eine Definition der (eigenen) Methode dazukommen muß.</p>
<p>(btw, ich wußte bisher nicht, daß Version 3 vom Standard abgesegnet ist)</p>
</blockquote>
<p>Ist auch nicht, weder im Aktuellen noch im Kommenden.</p>
</blockquote>
<p>Aber so sollte es gehen:</p>
<pre><code class="language-cpp">class foo {
  virtual void bar() = 0;
};

foo::bar() {
  // tue etwas
}

class derived_foo : foo {
  virtual void bar() {
    foo::bar();
  }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2070398</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2070398</guid><dc:creator><![CDATA[bmario]]></dc:creator><pubDate>Sun, 29 May 2011 10:32:12 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Methoden on Sun, 29 May 2011 10:42:40 GMT]]></title><description><![CDATA[<p>Aus dem C++-Standard:</p>
<p>10.4 Abstract classes §2 schrieb:</p>
<blockquote>
<p>A pure virtual function need be defined only if explicitly called with the qualified-id syntax (5.1). [Example:</p>
<pre><code class="language-cpp">class point { /* ... */ };
class shape { // abstract class
    point center;
    // ...
public:
    point where() { return center; }
    void move(point p) { center=p; draw(); }
    virtual void rotate(int) = 0; // pure virtual
    virtual void draw() = 0; // pure virtual
    // ...
};
</code></pre>
<p>—end example] [Note: a function declaration cannot provide both a pure-specifier and a definition<br />
—end note] [Example:</p>
<pre><code class="language-cpp">struct C {
    virtual void f() = 0 { }; // ill-formed
};
</code></pre>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2070401</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2070401</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 29 May 2011 10:42:40 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Methoden on Mon, 30 May 2011 07:39:33 GMT]]></title><description><![CDATA[<p>Dh eine Methode kann pure virtual sein und dennoch eine Definition haben (nur halt nicht im Header?)</p>
<p>Macht man das, wenn man in der Basisklasse Funktionalitaet zur Verfuegung stellen will aber dennoch alle Subklassen die Methode ueberschreiben sollen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2070793</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2070793</guid><dc:creator><![CDATA[fragger2]]></dc:creator><pubDate>Mon, 30 May 2011 07:39:33 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Methoden on Mon, 30 May 2011 08:03:05 GMT]]></title><description><![CDATA[<p>fragger2 schrieb:</p>
<blockquote>
<p>Dh eine Methode kann pure virtual sein und dennoch eine Definition haben (nur halt nicht <strong>in der Klassendefinition</strong>?)</p>
</blockquote>
<p>Habs mal korrigiert - im Header gehts, wenns explizit inline deklariert wird und außerhalb der Klassendefinition geschieht.</p>
<blockquote>
<p>Macht man das, wenn man in der Basisklasse Funktionalitaet zur Verfuegung stellen will aber dennoch alle Subklassen die Methode ueberschreiben sollen?</p>
</blockquote>
<p>Jup. Spezialfall sind Destruktoren, da MUSS die Funktionalität zur Verfügung gestellt werden, weil alle Destruktoren von abgeleiteten Klassen den Dtor implizit qualifiziert aufrufen. Dahingehend finde ich die von Nexus zitierte Zeile im Standard etwas missverständlich.</p>
<pre><code class="language-cpp">class M;

struct B
{
  ~B() = 0;
};

//Pflicht:
B::~B() {}

struct D : public B
{
  M m;

  //ggf nur implizit vom Compiler generiert:
  D(); 
  ~D();
};

D::D() 
//ggf implizit generierte Initialisierungsliste:
 : B(), m() 
{}

D::~D()
{}
//Psuedocode, das wird auf jeden Fall implizit generiert:
/*: m.~M(), B::~B()*/

//-&gt;qualifizierter Dtor-Aufruf des pur virtuellen Dtors!
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2070803</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2070803</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 30 May 2011 08:03:05 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Methoden on Mon, 30 May 2011 08:43:56 GMT]]></title><description><![CDATA[<blockquote>
<p>Dh eine Methode kann pure virtual sein und dennoch eine Definition haben (nur halt nicht im Header?)</p>
</blockquote>
<p>IMHO ist das nicht vom Standard abgesegnet =&gt; Es kann gehen, muss aber nicht. Hier haben die compiler halt &quot;Freiheiten&quot;.</p>
<blockquote>
<p>Macht man das, wenn man in der Basisklasse Funktionalitaet zur Verfuegung stellen will aber dennoch alle Subklassen die Methode ueberschreiben sollen?</p>
</blockquote>
<p>Was erreicht man damit:<br />
Zumindest bei mir (VS 2005) erkennt er ueber den Header, das die Funktion abstrakt ist, d.h. die Klasse verhaelt sich nach aussen &quot;normal&quot;, man kann sich also auf den Header verlassen.<br />
Die Implementation der Funktion wird mit zugelinkt aber wird ueber normale Funktionsaufrufe natuerlich nicht angesprungen. Das einzigste wie man den Code zum ausfuehren bekaeme ist ueber volle Qualifikation aka KlasseName::MethodenName, also so wie wenn man das &quot;virtual&quot; grundsätzlich austricksen woellte.</p>
<p>Ergo -&gt; Tut man eigentlich ueberhaupt nicht.<br />
Man erreicht ähnliche Effekte ueber andere, sauberere, offensichtlichere und damit besser wartbare Sprachmittel.<br />
Sowas nutzt man also eher, um den Nachfolger, der seinen Code warten soll, das Leben zur Hölle zu machen, warum auch immer ^^<br />
Anmerkung: Oft genug ist man selber sein eigener Nachfolger, man muss nur oft genug Dinge &quot;vergessen&quot; <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>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2070831</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2070831</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Mon, 30 May 2011 08:43:56 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Methoden on Mon, 30 May 2011 08:56:34 GMT]]></title><description><![CDATA[<p>RHBaum schrieb:</p>
<blockquote>
<blockquote>
<p>Dh eine Methode kann pure virtual sein und dennoch eine Definition haben (nur halt nicht im Header?)</p>
</blockquote>
<p>IMHO ist das nicht vom Standard abgesegnet =&gt; Es kann gehen, muss aber nicht. Hier haben die compiler halt &quot;Freiheiten&quot;.</p>
</blockquote>
<p>Siehe Zitat von Nexus oben. pv + getrennte Definition ist nicht nur Okay, sondern ggf. auch durchaus notwendig. pv+Definition gleichzeitig ist laut Standard ill-formed. Natürlich dürfen auch hier <strong>compilerspezifische</strong> Extensions greifen, die das eigentlich ungültige C++ dann anstandslos und korrekt übersetzen. Ist dann eben nur nicht portabel.</p>
<blockquote>
<p>[...] Das einzigste wie man den Code zum ausfuehren bekaeme ist ueber volle Qualifikation aka KlasseName::MethodenName, also so wie wenn man das &quot;virtual&quot; grundsätzlich austricksen woellte.</p>
<p>Ergo -&gt; Tut man eigentlich ueberhaupt nicht.</p>
</blockquote>
<p>Wenns nicht grade um Destruktoren geht, wo es Pflicht ist.</p>
<blockquote>
<p>Man erreicht ähnliche Effekte ueber andere, sauberere, offensichtlichere und damit besser wartbare Sprachmittel.</p>
</blockquote>
<p>Für nicht-Dtoren richtig. Wenn man eine Implementierung bereitstellt, muss man die auch irgendwo dokumentieren, damit der Anwender, der foo() in der abgeleiteten Klasse implementiert, das auch weiß. Wenn man stattdessen eine protected Funktion <code>void defaultFooBehavior();</code> in der Klasse deklariert, weiß jeder, was Sache ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2070841</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2070841</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 30 May 2011 08:56:34 GMT</pubDate></item></channel></rss>