<?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[Exception werfen beim Aufruf einer virtuellen Methode]]></title><description><![CDATA[<p>Erstmal die Klassenhierachie die ich verwende:</p>
<pre><code class="language-cpp">class A
{
public:
  virtual float berechneBla(double, double);
};

class B : public A
{
public
  float berechneBla(double, double);
};

class C : public A
{
public:
  float berechneBla(double, double);
};
</code></pre>
<p>Nun möchte ich die Methode allerdings nur in der Klasse C aufrufen. Ein Aufruf in Klasse B soll zur Exception führen. (Was kann man eigentlich in dem Fall mit dem Rückgabewert machen?) An der Klassenhierachie wollte ich so nichts ändern. Ich dachte mir das ich das mit einer Exception abfangen könnte, habe es aber bis jetzt leider noch nicht hinbekommen.</p>
<p>Desweiteren wollte ich eine eigene Exception-Klasse für dieses Problem schreiben. So und nun weiß ich leider nicht mehr weiter. Bücher, FAQ's und Google-Suche haben mich leider nicht fündig werden lassen, aber vielleicht weiß ja einer daruaf eine Antwort. <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>
]]></description><link>https://www.c-plusplus.net/forum/topic/161307/exception-werfen-beim-aufruf-einer-virtuellen-methode</link><generator>RSS for Node</generator><lastBuildDate>Fri, 11 Sep 2026 19:58:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/161307.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 05 Oct 2006 11:48:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Exception werfen beim Aufruf einer virtuellen Methode on Thu, 05 Oct 2006 11:52:11 GMT]]></title><description><![CDATA[<p>Erstmal die Klassenhierachie die ich verwende:</p>
<pre><code class="language-cpp">class A
{
public:
  virtual float berechneBla(double, double);
};

class B : public A
{
public
  float berechneBla(double, double);
};

class C : public A
{
public:
  float berechneBla(double, double);
};
</code></pre>
<p>Nun möchte ich die Methode allerdings nur in der Klasse C aufrufen. Ein Aufruf in Klasse B soll zur Exception führen. (Was kann man eigentlich in dem Fall mit dem Rückgabewert machen?) An der Klassenhierachie wollte ich so nichts ändern. Ich dachte mir das ich das mit einer Exception abfangen könnte, habe es aber bis jetzt leider noch nicht hinbekommen.</p>
<p>Desweiteren wollte ich eine eigene Exception-Klasse für dieses Problem schreiben. So und nun weiß ich leider nicht mehr weiter. Bücher, FAQ's und Google-Suche haben mich leider nicht fündig werden lassen, aber vielleicht weiß ja einer daruaf eine Antwort. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1149851</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1149851</guid><dc:creator><![CDATA[blueheart]]></dc:creator><pubDate>Thu, 05 Oct 2006 11:52:11 GMT</pubDate></item><item><title><![CDATA[Reply to Exception werfen beim Aufruf einer virtuellen Methode on Thu, 05 Oct 2006 12:01:50 GMT]]></title><description><![CDATA[<p>bin mir nicht sicher ob der stil so gut ist, aber geht sowas denn nicht?</p>
<pre><code class="language-cpp">class base
{
  public:
   virtual float test(){return 10.2;}
};

class member:public base
{
 public:
  virtual float test(){throw &quot;Darf hier nicht verwendet werden&quot;;};
};

int main(int argc, char* argv[])
{
 base* p = new base;
 try
    {
     try
        {
        p-&gt;test();
        }
     catch(const char* ch)
        {
         cout&lt;&lt;ch&lt;&lt;endl;
        }
     }
 __finally
   {
    delete p;
   }

 getch();       return 0;
}
//---------------------------------------------------------------------------
</code></pre>
<p>//nicht getestet</p>
<p>[Edit] wenn dann auch richtig <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/1149858</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1149858</guid><dc:creator><![CDATA[ser1al]]></dc:creator><pubDate>Thu, 05 Oct 2006 12:01:50 GMT</pubDate></item><item><title><![CDATA[Reply to Exception werfen beim Aufruf einer virtuellen Methode on Thu, 05 Oct 2006 12:08:34 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>wenn du nicht willst, dass Leute die Methode in B aufrufen, dann mach es so:</p>
<pre><code class="language-cpp">class Base {
public:
  virtual void foo();
};

class Derived : public Base
{
  using Base::foo;

public:
  //was auch immer...
};

//... weitere abgeleitete Klassen
</code></pre>
<p>Exceptions zu werfen, ist hier imo der falsche Ansatz, denn dann wird der Fehler erst zur Laufzeit auftreten. Anscheinend ist es aber deine Absicht, den Aufruf der Methode ganz zu verbieten, also wäre ein Compile-time Fehler angebrachter.</p>
<p>MfG</p>
<p>GPC</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1149868</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1149868</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Thu, 05 Oct 2006 12:08:34 GMT</pubDate></item><item><title><![CDATA[Reply to Exception werfen beim Aufruf einer virtuellen Methode on Thu, 05 Oct 2006 12:21:05 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>soweit ich weiß, ist &quot;__finally&quot; nicht standardkonform, sondern proprietär (Windows-irgendwas ?). Ansonsten ist das Beispiel schon korrekt, aber nicht ganz auf den Fall des Threaderstellers zugeschnitten.</p>
<pre><code class="language-cpp">#include &lt;exception&gt;
class A
{
  public:
   virtual float test(){return 10.2;}
};

class B :public base
{
 public:
  virtual float test(){return 11.2; };
};

class C :public base
{
 public:
  virtual float test(){throw std::runtime_error(&quot;Darf nicht aufgerufen werden&quot;) ;};
};

int main(int argc, char* argv[])
{
    A* p = new C;
    try {
       p-&gt;test();
    }
    catch(std::runtime_error&amp; e) {
        cout&lt;&lt;e.what() &lt;&lt;endl;
        delete p;
    }
    catch(...) {
        delete p;
        throw;
    }
    delete p;
    getch();
    return 0;
}
</code></pre>
<p>//nicht getestet</p>
<p>Aber GPCs Vorschlag finde ich auch nicht schlecht....</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1149874</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1149874</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 05 Oct 2006 12:21:05 GMT</pubDate></item><item><title><![CDATA[Reply to Exception werfen beim Aufruf einer virtuellen Methode on Thu, 05 Oct 2006 12:15:58 GMT]]></title><description><![CDATA[<p>GPC schrieb:</p>
<blockquote>
<pre><code class="language-cpp">class Derived : public Base
{
  using Base::foo;

public:
  //was auch immer...
};

//... weitere abgeleitete Klassen
</code></pre>
</blockquote>
<p>Hi, leider verstehe ich diese Lösung nicht wirklich. Ok ich gebe die Methode foo aus der Klasse Base bekannt. Aber die war doch auch schon vorher bekannt? Tut mir leid aber ich verstehe den Ansatz schon gar nicht.</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1149875</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1149875</guid><dc:creator><![CDATA[blueheart]]></dc:creator><pubDate>Thu, 05 Oct 2006 12:15:58 GMT</pubDate></item><item><title><![CDATA[Reply to Exception werfen beim Aufruf einer virtuellen Methode on Thu, 05 Oct 2006 12:17:34 GMT]]></title><description><![CDATA[<p>Mein Code sagt einfach, dass die Methode foo in der Klasse Derived ab jetzt privat ist <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1149881</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1149881</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Thu, 05 Oct 2006 12:17:34 GMT</pubDate></item><item><title><![CDATA[Reply to Exception werfen beim Aufruf einer virtuellen Methode on Thu, 05 Oct 2006 12:26:17 GMT]]></title><description><![CDATA[<p>GPC schrieb:</p>
<blockquote>
<p>Mein Code sagt einfach, dass die Methode foo in der Klasse Derived ab jetzt privat ist <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>
</blockquote>
<p>Das funktioniert aber nur solange, wie nicht mit Basisklassen-Zeigern gearbeitet wird.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1149889</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1149889</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Thu, 05 Oct 2006 12:26:17 GMT</pubDate></item><item><title><![CDATA[Reply to Exception werfen beim Aufruf einer virtuellen Methode on Thu, 05 Oct 2006 12:27:51 GMT]]></title><description><![CDATA[<p>GPC schrieb:</p>
<blockquote>
<p>Mein Code sagt einfach, dass die Methode foo in der Klasse Derived ab jetzt privat ist <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>
</blockquote>
<p>Hmmm, aber verhindert das nicht nur den &quot;statischen Aufruf&quot; (also, wenn der statische Typ C ist) ?<br />
Ich glaube nicht, dass das gegen das o.g. Verhalten (via Basisklassen-Pointer) schützt.</p>
<p>Edith: 2l8 !!</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1149892</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1149892</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 05 Oct 2006 12:27:51 GMT</pubDate></item><item><title><![CDATA[Reply to Exception werfen beim Aufruf einer virtuellen Methode on Thu, 05 Oct 2006 12:36:00 GMT]]></title><description><![CDATA[<p>Err, jupp. Aber von Basisklassenzeigern sprach bisher auch noch niemand <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>
<p>Simon2 schrieb:</p>
<blockquote>
<p>Edith: 2l8 !!</p>
</blockquote>
<p>Grüß Edith von mir <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/1149897</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1149897</guid><dc:creator><![CDATA[GPC|off]]></dc:creator><pubDate>Thu, 05 Oct 2006 12:36:00 GMT</pubDate></item><item><title><![CDATA[Reply to Exception werfen beim Aufruf einer virtuellen Methode on Thu, 05 Oct 2006 12:50:52 GMT]]></title><description><![CDATA[<p>GPC|off schrieb:</p>
<blockquote>
<p>...Aber von Basisklassenzeigern sprach bisher auch noch niemand <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>
</blockquote>
<p>Nanana:</p>
<p>ser1al schrieb:</p>
<blockquote>
<p>...</p>
<pre><code class="language-cpp">...
 base* p = new base;
...
</code></pre>
</blockquote>
<p>und ehrlich gesagt: Wer macht schon Polymorphie anders ? :p</p>
<p>GPC|off schrieb:</p>
<blockquote>
<p>...<br />
Grüß Edith von mir <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>Gruß zurück <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1149901</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1149901</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 05 Oct 2006 12:50:52 GMT</pubDate></item><item><title><![CDATA[Reply to Exception werfen beim Aufruf einer virtuellen Methode on Thu, 05 Oct 2006 12:48:12 GMT]]></title><description><![CDATA[<p>tja, eigentlich wollte ich mit den Objekten der Klasse B und C arbeiten.</p>
<p>Aber mein Kopf will irgendwie nicht mehr an eine richtige Lösung glauben.<br />
(immer diese Fehlermeldungen <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 />
Trotzdem mit eurer hilfe werde ich es wohl doch vielleicht noch hinbekommen.</p>
<p>Werde denn mal zum schluss meine lösung dazu posten</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1149904</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1149904</guid><dc:creator><![CDATA[blueheart]]></dc:creator><pubDate>Thu, 05 Oct 2006 12:48:12 GMT</pubDate></item><item><title><![CDATA[Reply to Exception werfen beim Aufruf einer virtuellen Methode on Thu, 05 Oct 2006 12:49:48 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>GPC|off schrieb:</p>
<blockquote>
<p>...Aber von Basisklassenzeigern sprach bisher auch noch niemand <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>
</blockquote>
<p>Nanana:</p>
<p>ser1al schrieb:</p>
<blockquote>
<p>...<br />
[cpp]<br />
...<br />
base* p = new base;<br />
...</p>
</blockquote>
</blockquote>
<p>Oha, richtig. ser1als Code hatte ich nur überflogen.</p>
<blockquote>
<p>und ehrlich gesagt: Wer macht schon Polymorphie anders ? :p</p>
</blockquote>
<p>klaro, ihr habt ja auch recht. Dennoch find ich den Exception Ansatz nicht wirklich toll... Während man halt so mit dem Programm arbeitet, poppt ne MessageBox hoch: &quot;Boink. Der Programmierer hat eine Methode verwendet, die er nicht verwenden darf, ich mach Feierabend.&quot; ^^</p>
<p>Grüße</p>
<p>GPC</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1149905</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1149905</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Thu, 05 Oct 2006 12:49:48 GMT</pubDate></item><item><title><![CDATA[Reply to Exception werfen beim Aufruf einer virtuellen Methode on Thu, 05 Oct 2006 12:53:12 GMT]]></title><description><![CDATA[<p>Tja, wenn Du uns Deine Probleme nicht mitteilst, wirst Du wohl nie zu einer funktionierenden Lösung kommen (auch wenn es sie gibt, und eigentlich sehr trivial ist sowie hier schonmal gepostet wurde).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1149906</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1149906</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 05 Oct 2006 12:53:12 GMT</pubDate></item><item><title><![CDATA[Reply to Exception werfen beim Aufruf einer virtuellen Methode on Thu, 05 Oct 2006 12:56:52 GMT]]></title><description><![CDATA[<p>GPC schrieb:</p>
<blockquote>
<p>...Dennoch find ich den Exception Ansatz nicht wirklich toll...</p>
</blockquote>
<p>Dem stimme ich uneingeschränkt zu.</p>
<p>blueheart schrieb:</p>
<blockquote>
<p>...mein Kopf will irgendwie nicht mehr an eine richtige Lösung glauben....</p>
</blockquote>
<p>Das (und GPCs Bauchschmerzen) wird vermutlich daran liegen, dass Du &quot;unsauber designt hast&quot;. Wenn B und C von A erben, heißt das, dass sie beide &quot;ein A sind&quot;.<br />
Wenn dann A eine virtuelle Funktion f() hat, heißt dass das &quot;jedes A auch f() kann&quot;.<br />
Da nun &quot;jedes C ein A ist&quot;, und &quot;jedes A f() kann&quot; =&gt; &quot;C kann f()&quot;.</p>
<p>Wenn Du nun zu dem Schluß kommst, C soll &quot;f() nicht können&quot;, hast Du irgendwo einen Denkfehler gemacht. Entweder &quot;kann nicht jedes A f()&quot; oder &quot;C ist kein A&quot;....</p>
<p>Denk' Dir das nochmal durch.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1149908</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1149908</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 05 Oct 2006 12:56:52 GMT</pubDate></item><item><title><![CDATA[Reply to Exception werfen beim Aufruf einer virtuellen Methode on Thu, 05 Oct 2006 12:58:33 GMT]]></title><description><![CDATA[<p>Wenn in A die Methode pure virtual ist, müsste es doch mit dem Verschieben<br />
der Methode in den private Bereich klappen, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1149910</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1149910</guid><dc:creator><![CDATA[phlox81]]></dc:creator><pubDate>Thu, 05 Oct 2006 12:58:33 GMT</pubDate></item><item><title><![CDATA[Reply to Exception werfen beim Aufruf einer virtuellen Methode on Thu, 05 Oct 2006 13:02:23 GMT]]></title><description><![CDATA[<p>phlox81 schrieb:</p>
<blockquote>
<p>Wenn in A die Methode pure virtual ist, müsste es doch mit dem Verschieben<br />
der Methode in den private Bereich klappen, oder?</p>
</blockquote>
<p>Das Problem ist eher, dass wir hier von Laufzeitpolymorphie sprechen. Und der kann man leider weder mit Compilezeit- (und dazu zählt die Zugriffskontrolle via private) noch mit Linkzeit-sicherungsmechanismen (wie einer undefinierten pure virtual function) sinnvoll beikommen.<br />
Erst zur Laufzeit entscheidet sich, ob der Basisklassenpointer auf ein B oder ein C zeigt...</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1149912</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1149912</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 05 Oct 2006 13:02:23 GMT</pubDate></item><item><title><![CDATA[Reply to Exception werfen beim Aufruf einer virtuellen Methode on Thu, 05 Oct 2006 13:18:14 GMT]]></title><description><![CDATA[<p>GPC schrieb:</p>
<blockquote>
<p>Simon2 schrieb:</p>
<blockquote>
<p>GPC|off schrieb:</p>
<blockquote>
<p>...Aber von Basisklassenzeigern sprach bisher auch noch niemand <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>
</blockquote>
<p>Nanana:</p>
<p>ser1al schrieb:</p>
<blockquote>
<p>...<br />
[cpp]<br />
...<br />
base* p = new base;<br />
...</p>
</blockquote>
</blockquote>
<p>Oha, richtig. ser1als Code hatte ich nur überflogen.</p>
<p>Grüße</p>
<p>GPC</p>
</blockquote>
<p>hehe, eigentli wollte ich da member schrieben <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>Simon2 schrieb:</p>
<blockquote>
<p>GPC schrieb:</p>
<blockquote>
<p>...Dennoch find ich den Exception Ansatz nicht wirklich toll...</p>
</blockquote>
<p>Dem stimme ich uneingeschränkt zu.</p>
<p>Gruß,</p>
<p>Simon2.</p>
</blockquote>
<p>und das habe ich ja auch gesagt, das ich den stil nicht gut finde...dennoch wollte ich ihm sagen das es schon funktioniert!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1149919</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1149919</guid><dc:creator><![CDATA[ser1al]]></dc:creator><pubDate>Thu, 05 Oct 2006 13:18:14 GMT</pubDate></item><item><title><![CDATA[Reply to Exception werfen beim Aufruf einer virtuellen Methode on Thu, 05 Oct 2006 13:27:27 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>phlox81 schrieb:</p>
<blockquote>
<p>Wenn in A die Methode pure virtual ist, müsste es doch mit dem Verschieben<br />
der Methode in den private Bereich klappen, oder?</p>
</blockquote>
<p>Das Problem ist eher, dass wir hier von Laufzeitpolymorphie sprechen. Und der kann man leider weder mit Compilezeit- (und dazu zählt die Zugriffskontrolle via private) noch mit Linkzeit-sicherungsmechanismen (wie einer undefinierten pure virtual function) sinnvoll beikommen.<br />
Erst zur Laufzeit entscheidet sich, ob der Basisklassenpointer auf ein B oder ein C zeigt...</p>
<p>Gruß,</p>
<p>Simon2.</p>
</blockquote>
<p>hm, stimmt...</p>
<p>Dann bleibt nur die Exception, oder in B eine leere Methode implementieren, der Aufruf tut dann nix.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1149924</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1149924</guid><dc:creator><![CDATA[phlox81]]></dc:creator><pubDate>Thu, 05 Oct 2006 13:27:27 GMT</pubDate></item><item><title><![CDATA[Reply to Exception werfen beim Aufruf einer virtuellen Methode on Thu, 05 Oct 2006 13:53:06 GMT]]></title><description><![CDATA[<p>phlox81 schrieb:</p>
<blockquote>
<p>...in B eine leere Methode implementieren, der Aufruf tut dann nix.</p>
</blockquote>
<p>Ist nicht wirklich besser - nur eine andere Form vom &quot;broken contract&quot; <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="😉"
    /> (dann schon lieber eine exception; da hat der Anwender zwar die AKarte gezogen, aber immerhin merkt irgendjemand, dass unerwünschtes Verhalten vorliegt).</p>
<p>Aber wie gesagt: Ich denke, dass hier einfach ein Designfehler vorliegt, den es zu beheben gilt.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1149942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1149942</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 05 Oct 2006 13:53:06 GMT</pubDate></item><item><title><![CDATA[Reply to Exception werfen beim Aufruf einer virtuellen Methode on Thu, 05 Oct 2006 14:07:22 GMT]]></title><description><![CDATA[<p>Wieso nicht einfach in C die Methode Nicht definieren.<br />
Jeder Aufruf würde dann zu einem Linker-Error führen ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1149954</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1149954</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 05 Oct 2006 14:07:22 GMT</pubDate></item><item><title><![CDATA[Reply to Exception werfen beim Aufruf einer virtuellen Methode on Thu, 05 Oct 2006 14:16:51 GMT]]></title><description><![CDATA[<p>Freak_Coder schrieb:</p>
<blockquote>
<p>Wieso nicht einfach in C die Methode Nicht definieren.<br />
Jeder Aufruf würde dann zu einem Linker-Error führen ...</p>
</blockquote>
<p>Wie gesagt: Weils nicht klappt. <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 />
Einerseits kann es der Linker gar keinen Fehler feststellen (ein entsprechender Aufruf würde mir A::f() verbunden), andererseits kann der Linker nicht feststellen, was erst zur Laufzeit feststeht.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1149965</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1149965</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 05 Oct 2006 14:16:51 GMT</pubDate></item><item><title><![CDATA[Reply to Exception werfen beim Aufruf einer virtuellen Methode on Thu, 05 Oct 2006 15:35:32 GMT]]></title><description><![CDATA[<blockquote>
<p>Während man halt so mit dem Programm arbeitet, poppt ne MessageBox hoch: &quot;Boink. Der Programmierer hat eine Methode verwendet, die er nicht verwenden darf, ich mach Feierabend.&quot; ^^</p>
</blockquote>
<p>Hehe ich stell mir das grade mit so einem Programm wie Word oder PaintshopPro vor <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1150012</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1150012</guid><dc:creator><![CDATA[DEvent]]></dc:creator><pubDate>Thu, 05 Oct 2006 15:35:32 GMT</pubDate></item><item><title><![CDATA[Reply to Exception werfen beim Aufruf einer virtuellen Methode on Thu, 05 Oct 2006 20:03:46 GMT]]></title><description><![CDATA[<p>DEvent schrieb:</p>
<blockquote>
<p>Hehe ich stell mir das grade mit so einem Programm wie Word oder PaintshopPro vor <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
</blockquote>
<p>Wäre allemal aufschlussreicher als &quot;OpenOffice.exe hat ein Problem verursacht und muss beendet werden. Möchten Sie einen Problembericht an Microsoft senden?&quot; <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1150188</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1150188</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 05 Oct 2006 20:03:46 GMT</pubDate></item><item><title><![CDATA[Reply to Exception werfen beim Aufruf einer virtuellen Methode on Thu, 05 Oct 2006 21:18:33 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>GPC schrieb:</p>
<blockquote>
<p>...Dennoch find ich den Exception Ansatz nicht wirklich toll...</p>
</blockquote>
<p>Dem stimme ich uneingeschränkt zu.</p>
<p>blueheart schrieb:</p>
<blockquote>
<p>...mein Kopf will irgendwie nicht mehr an eine richtige Lösung glauben....</p>
</blockquote>
<p>Das (und GPCs Bauchschmerzen) wird vermutlich daran liegen, dass Du &quot;unsauber designt hast&quot;. Wenn B und C von A erben, heißt das, dass sie beide &quot;ein A sind&quot;.<br />
Wenn dann A eine virtuelle Funktion f() hat, heißt dass das &quot;jedes A auch f() kann&quot;.<br />
Da nun &quot;jedes C ein A ist&quot;, und &quot;jedes A f() kann&quot; =&gt; &quot;C kann f()&quot;.</p>
<p>Wenn Du nun zu dem Schluß kommst, C soll &quot;f() nicht können&quot;, hast Du irgendwo einen Denkfehler gemacht. Entweder &quot;kann nicht jedes A f()&quot; oder &quot;C ist kein A&quot;....</p>
<p>Denk' Dir das nochmal durch.</p>
<p>Gruß,</p>
<p>Simon2.</p>
</blockquote>
<p>Auf das Problem stößt man schneller als du denkst.<br />
Schau dir z.B. mal das Kompositum Pattern an.Da sind auch alle Objekte Komponenten....aber Blätter können keine Kinder haben und somit auch keine sinnvolle Implementierung der entsprechenden Methoden bieten.<br />
Somit wäre ja eines der &quot;wichtigsten&quot; Design Patterns ein Designfehler?</p>
<p>Gruß Spacelord</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1150226</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1150226</guid><dc:creator><![CDATA[Spacelord]]></dc:creator><pubDate>Thu, 05 Oct 2006 21:18:33 GMT</pubDate></item><item><title><![CDATA[Reply to Exception werfen beim Aufruf einer virtuellen Methode on Fri, 06 Oct 2006 06:14:03 GMT]]></title><description><![CDATA[<p>Spacelord schrieb:</p>
<blockquote>
<p>Auf das Problem stößt man schneller als du denkst.<br />
Schau dir z.B. mal das Kompositum Pattern an.Da sind auch alle Objekte Komponenten....aber Blätter können keine Kinder haben und somit auch keine sinnvolle Implementierung der entsprechenden Methoden bieten.<br />
Somit wäre ja eines der &quot;wichtigsten&quot; Design Patterns ein Designfehler?</p>
<p>Gruß Spacelord</p>
</blockquote>
<p>Nein, die Komposition leitest du von einer Basisklasse ab, welche nur die für Blatt benötigten Methoden besitzt.<br />
Siehe auch <a href="http://de.wikipedia.org/wiki/Kompositum_(Entwurfsmuster)" rel="nofollow">http://de.wikipedia.org/wiki/Kompositum_(Entwurfsmuster)</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1150292</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1150292</guid><dc:creator><![CDATA[phlox81]]></dc:creator><pubDate>Fri, 06 Oct 2006 06:14:03 GMT</pubDate></item><item><title><![CDATA[Reply to Exception werfen beim Aufruf einer virtuellen Methode on Fri, 06 Oct 2006 06:33:53 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>Aber wie gesagt: Ich denke, dass hier einfach ein Designfehler vorliegt, den es zu beheben gilt.</p>
</blockquote>
<p>Das kann man so nicht sehen, dazu müßten wir mehr Informationen haben. Manchmal können eben doch alle As irgendwas. Nur eine Ausnahme gibt es: Cs sind zwar As, aber eine einzige Funktion unterstützen sie doch nicht. Dann lieber sowas, als eine furchtbar komplizierte Lösung, die die Gemeinsamkeiten, die vielleicht doch bestehen verdeckt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1150299</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1150299</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Fri, 06 Oct 2006 06:33:53 GMT</pubDate></item></channel></rss>