<?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[Methodenzugriff]]></title><description><![CDATA[<p>Hi,</p>
<p>angenommen ich habe einen Pointer auf ein Objekt der Klasse A. Von A ist eine Klasse B abgeleitet, die eine Methode enthält, welche in A nicht existiert. Nun zeigt der Pointer (der eigentlich auf ein Objekt von A zeigen soll) auf ein Objekt von B (was ja Spezialisierung von A ist). Die Möglichkeit die mir einfällt ist ein Typecast. Ist das die eleganteste Lösung?</p>
<p>Hier ein kleines Code-Beispiel:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class A {
    public:
        void foo() {
            std::cout &lt;&lt; &quot;A does foo\n&quot;;
        }
};

class B: public A {
    public:
        void bar() {
            std::cout &lt;&lt; &quot;B does bar\n&quot;;
        }
};

int main() {
    A* obj = new B();
    obj-&gt;foo();
    ((B*)obj)-&gt;bar(); // &lt;-- um diese Stelle geht es
    return 0;
}
</code></pre>
<p>LG</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/309002/methodenzugriff</link><generator>RSS for Node</generator><lastBuildDate>Wed, 05 Aug 2026 14:13:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/309002.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 11 Oct 2012 15:35:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Methodenzugriff on Thu, 11 Oct 2012 15:35:47 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>angenommen ich habe einen Pointer auf ein Objekt der Klasse A. Von A ist eine Klasse B abgeleitet, die eine Methode enthält, welche in A nicht existiert. Nun zeigt der Pointer (der eigentlich auf ein Objekt von A zeigen soll) auf ein Objekt von B (was ja Spezialisierung von A ist). Die Möglichkeit die mir einfällt ist ein Typecast. Ist das die eleganteste Lösung?</p>
<p>Hier ein kleines Code-Beispiel:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class A {
    public:
        void foo() {
            std::cout &lt;&lt; &quot;A does foo\n&quot;;
        }
};

class B: public A {
    public:
        void bar() {
            std::cout &lt;&lt; &quot;B does bar\n&quot;;
        }
};

int main() {
    A* obj = new B();
    obj-&gt;foo();
    ((B*)obj)-&gt;bar(); // &lt;-- um diese Stelle geht es
    return 0;
}
</code></pre>
<p>LG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2259292</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2259292</guid><dc:creator><![CDATA[Glocke]]></dc:creator><pubDate>Thu, 11 Oct 2012 15:35:47 GMT</pubDate></item><item><title><![CDATA[Reply to Methodenzugriff on Thu, 11 Oct 2012 15:53:36 GMT]]></title><description><![CDATA[<p>Die eleganteste Lösung ist</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class A {
    public:
        void foo() {
            std::cout &lt;&lt; &quot;A does foo\n&quot;;
        }
};

class B: public A {
    public:
        void bar() {
            std::cout &lt;&lt; &quot;B does bar\n&quot;;
        }
};

int main() {
    B obj;
    obj.bar();
    return 0;
}
</code></pre>
<p><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>So ein sog. Downcast (von Basisklassenzeiger nach Zeiger auf abgeleitete Klasse), ist praktisch immer ein Hinweis auf einen Designfehler. Denn überleg mal, was der Cast bedeutet; Wenn du an der entsprechenden Stelle im Programm nur einen Pointer auf ein A hast, dann aus dem Grund, dass der entsprechende Code mit jedem beliebigen A funktionieren soll. Wenn du dort nun deinen A* in einen B* casten müsstest, dann kann das eigentlich nur zwei Gründe haben: Entweder der entsprechende Code funktioniert eben doch nicht für jedes beliebige A und du solltest dort eigentlich von vorn herein statt einem A* einen B* haben, oder deine Abstraktion A modelliert überhaupt nicht, was du damit modellieren wolltest. Egal wie herum, in beiden Fällen zeigt sich durch den Cast ein Widerspruch in deinem Design, den es aufzulösen gilt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2259293</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2259293</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Thu, 11 Oct 2012 15:53:36 GMT</pubDate></item><item><title><![CDATA[Reply to Methodenzugriff on Thu, 11 Oct 2012 15:45:49 GMT]]></title><description><![CDATA[<p>Warum gehst du nicht den üblichen Weg über Polymorphie? Nenn die Methode in B auch foo und mach sie in A virtual - fertig...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2259295</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2259295</guid><dc:creator><![CDATA[kritzelklotz]]></dc:creator><pubDate>Thu, 11 Oct 2012 15:45:49 GMT</pubDate></item><item><title><![CDATA[Reply to Methodenzugriff on Thu, 11 Oct 2012 16:20:03 GMT]]></title><description><![CDATA[<p>kritzelklotz schrieb:</p>
<blockquote>
<p>Warum gehst du nicht den üblichen Weg über Polymorphie? Nenn die Methode in B auch foo und mach sie in A virtual - fertig...</p>
</blockquote>
<p>Ich will sie aber nicht überschreiben, sondern B soll A um eine weitere Methode erweitern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2259316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2259316</guid><dc:creator><![CDATA[Glocke]]></dc:creator><pubDate>Thu, 11 Oct 2012 16:20:03 GMT</pubDate></item><item><title><![CDATA[Reply to Methodenzugriff on Thu, 11 Oct 2012 16:33:59 GMT]]></title><description><![CDATA[<p>Wenn schon casten, dann schau Dir mal z.B. dynamic_cast an.<br />
Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2259321</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2259321</guid><dc:creator><![CDATA[Helmut.Jakoby]]></dc:creator><pubDate>Thu, 11 Oct 2012 16:33:59 GMT</pubDate></item><item><title><![CDATA[Reply to Methodenzugriff on Thu, 11 Oct 2012 16:38:05 GMT]]></title><description><![CDATA[<p>Helmut.Jakoby schrieb:</p>
<blockquote>
<p>Wenn schon casten, dann schau Dir mal z.B. dynamic_cast an.<br />
Gruß</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_down"
      title=":-1:"
      alt="👎"
    /><br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> für dot</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2259323</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2259323</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Thu, 11 Oct 2012 16:38:05 GMT</pubDate></item><item><title><![CDATA[Reply to Methodenzugriff on Thu, 11 Oct 2012 16:47:09 GMT]]></title><description><![CDATA[<p>Was ist an 'Anschauen' so schlecht? Nicht wissen lassen und Dogma finde ich noch schlechter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2259327</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2259327</guid><dc:creator><![CDATA[Helmut.Jakoby]]></dc:creator><pubDate>Thu, 11 Oct 2012 16:47:09 GMT</pubDate></item><item><title><![CDATA[Reply to Methodenzugriff on Thu, 11 Oct 2012 17:35:58 GMT]]></title><description><![CDATA[<p>Was für ein Dogma meinst Du?</p>
<p>In der Regel ist es so, dass man einen Downcast deswegen nicht braucht, weil an der Stelle, an der die abgeleitete Klasse gebraucht werden soll, diese auch bekannt sein soll. Oder, man interessiert sich nicht dafür, welcher Erbe direkt übergeben wird, will aber zulassen, dass es dort ganz unterschiedliche gibt und gerade dafür dient Polymorphie.</p>
<p>Auf Polymorphie zu verzichten, aber den Downcast zu benutzen, bedeutet, dass man hier eigentlich auf eine Abstraktionsebene (nämlich Base*) gegangen ist, die man dann später doch nicht haben will (weil Downcast notwendig ist). Es gibt jetzt dafür einige Stellen, an denen das nun Mal so ist, beispielsweise auch in so gewissen UI-Situationen je nach Framework oder für manche Formen des Double Dispatching.</p>
<p>Aber auf so eine allgemeine Frage wie hier, muss die Antwort lauten, dass man sich das Design noch einmal genau anschauen sollte, denn der Standardfall ist eben, dass ein notwendiger Downcast von schlechtem Design zeugt. Das ist einfach eine Erfahrungssache und Erfahrung hat dot einige. Es ist ein großer Vorteil darauf zurückgreifen zu können, denn später spart einem das evtl. viel Zeit, die man sonst durch Redesign oder durch langsameres (gemeint ist Entwicklerzeit) Erweitern/Ändern wegen nicht besonders schönem Design vergeudetet hätte. <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/2259353</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2259353</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Thu, 11 Oct 2012 17:35:58 GMT</pubDate></item></channel></rss>