<?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[Nicht vorhanden Member der Superklasse aufrufen]]></title><description><![CDATA[<p>Hallo,<br />
tut mir Leid, mit fiel kein besserer Titel ein xd</p>
<p>Ich zeig einfach mal direkt den Beispielcode:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class Base
{
    public:
        void foo(Base&amp; other);
        virtual void bar(Base&amp; other) = 0;
        virtual int kind() = 0;
};

class A : public Base
{
    public:
        void bar(Base&amp; other);
        int kind();
        int a_int;
};

class B : public Base
{
    public:
        void bar(Base&amp; other);
        int kind();
        int b_int;
};

void Base::foo(Base&amp; other)
{
    if (kind() == 0)
        if (other.kind() == 1)
            bar(other);
    else
        if (other.kind() == 0)
            bar(other);
}

int A::kind() {return 0;}

void A::bar(Base&amp; other) {std::cout &lt;&lt; a_int &lt;&lt; &quot; &quot; &lt;&lt; other.b_int &lt;&lt; std::endl;}

int B::kind() {return 1;}

void B::bar(Base&amp; other) {std::cout &lt;&lt; b_int &lt;&lt; &quot; &quot; &lt;&lt; other.a_int &lt;&lt; std::endl;}

int main()
{
    A a; B b;
    a.foo(b);
    return 0;
}
</code></pre>
<p>Wie man sieht, kann A::bar nur aufgerufen werden, wenn der Parameter ein B-Objekt ist und andersherum.<br />
Theoretisch kann ich also sicher in A::bar auf other.b_int und in B::bar auf other.a_int zugreifen. Aber natürlich weiß der Compiler das ja nicht <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="🙂"
    /><br />
Gibts da eine Möglichkeit, wie ich das so machen kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/280016/nicht-vorhanden-member-der-superklasse-aufrufen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 07:15:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/280016.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 07 Jan 2011 18:16:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Nicht vorhanden Member der Superklasse aufrufen on Fri, 07 Jan 2011 18:16:51 GMT]]></title><description><![CDATA[<p>Hallo,<br />
tut mir Leid, mit fiel kein besserer Titel ein xd</p>
<p>Ich zeig einfach mal direkt den Beispielcode:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class Base
{
    public:
        void foo(Base&amp; other);
        virtual void bar(Base&amp; other) = 0;
        virtual int kind() = 0;
};

class A : public Base
{
    public:
        void bar(Base&amp; other);
        int kind();
        int a_int;
};

class B : public Base
{
    public:
        void bar(Base&amp; other);
        int kind();
        int b_int;
};

void Base::foo(Base&amp; other)
{
    if (kind() == 0)
        if (other.kind() == 1)
            bar(other);
    else
        if (other.kind() == 0)
            bar(other);
}

int A::kind() {return 0;}

void A::bar(Base&amp; other) {std::cout &lt;&lt; a_int &lt;&lt; &quot; &quot; &lt;&lt; other.b_int &lt;&lt; std::endl;}

int B::kind() {return 1;}

void B::bar(Base&amp; other) {std::cout &lt;&lt; b_int &lt;&lt; &quot; &quot; &lt;&lt; other.a_int &lt;&lt; std::endl;}

int main()
{
    A a; B b;
    a.foo(b);
    return 0;
}
</code></pre>
<p>Wie man sieht, kann A::bar nur aufgerufen werden, wenn der Parameter ein B-Objekt ist und andersherum.<br />
Theoretisch kann ich also sicher in A::bar auf other.b_int und in B::bar auf other.a_int zugreifen. Aber natürlich weiß der Compiler das ja nicht <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="🙂"
    /><br />
Gibts da eine Möglichkeit, wie ich das so machen kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2003832</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2003832</guid><dc:creator><![CDATA[wurst]]></dc:creator><pubDate>Fri, 07 Jan 2011 18:16:51 GMT</pubDate></item><item><title><![CDATA[Reply to Nicht vorhanden Member der Superklasse aufrufen on Fri, 07 Jan 2011 18:36:55 GMT]]></title><description><![CDATA[<p>und wieso genau machst du aus dem int nicht ein Member von Base?<br />
oder eine Virtuelle Get-Methode? zB Base::GetInt()</p>
<p>Edit: du kannst natürlich auch dynamic_cast&lt;&gt; oder static_cast&lt;&gt; einsetzen.<br />
Ich empfehle dir aber, wenn du schon polymorphie einsetzt, deine Interface-Klasse so zu planen, dass du keine cast's eisnetzen musst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2003842</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2003842</guid><dc:creator><![CDATA[BigNeal]]></dc:creator><pubDate>Fri, 07 Jan 2011 18:36:55 GMT</pubDate></item><item><title><![CDATA[Reply to Nicht vorhanden Member der Superklasse aufrufen on Fri, 07 Jan 2011 18:35:50 GMT]]></title><description><![CDATA[<p>Eine Wurst schrieb:</p>
<blockquote>
<p>Theoretisch kann ich also sicher in A::bar auf other.b_int und in B::bar auf other.a_int zugreifen.</p>
</blockquote>
<p>Wenn du absolut sicher bist, dann nimm einen <code>static_cast</code> .</p>
<p>Eine Wurst schrieb:</p>
<blockquote>
<p>Theoretisch ...</p>
</blockquote>
<p>Die Theorie sieht anders aus. Öffentliche Member können leicht modifiziert werden, wobei du die vermutlich nicht absichtlich öffentlich gemacht hast.</p>
<p>Aber gegen das kannst du dich nicht wehren:</p>
<pre><code class="language-cpp">class C : public Base {
public:
    int kind() { return 0; }
    char *this_is_not_an_integer;
};
</code></pre>
<p>Der einige Ausweg: <code>dynamic_cast</code> . Vollkommen ungefährlich, vollkommen inperformant und ein guter Indikator für schlechten Code.</p>
<p>Egal was du erreichen willst, vergiss es und mach das über eine virtuelle Funktion.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2003846</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2003846</guid><dc:creator><![CDATA[theoraxis]]></dc:creator><pubDate>Fri, 07 Jan 2011 18:35:50 GMT</pubDate></item><item><title><![CDATA[Reply to Nicht vorhanden Member der Superklasse aufrufen on Fri, 07 Jan 2011 18:40:50 GMT]]></title><description><![CDATA[<p>Kurz und knapp, dass geht so nicht. Ein A ist ein A und ein B ist ein B, auch wenn Base der Papa von A und B ist. Und Base wird auch niemals die Eigenschaften seiner Kinder kennen. Diese kennen aber die Eigenschaften, die sie von Base geerbt haben. Du solltest dir die Polymorphie noch mal ansehen, so macht das alles keinen Sinn. Polymorphie ist auch nur mit Zeigern möglich. Was damit zusammen hängt, dass A eben kein Base ist, aber A ein Base enthält.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2003852</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2003852</guid><dc:creator><![CDATA[Paul Müller]]></dc:creator><pubDate>Fri, 07 Jan 2011 18:40:50 GMT</pubDate></item><item><title><![CDATA[Reply to Nicht vorhanden Member der Superklasse aufrufen on Fri, 07 Jan 2011 18:45:26 GMT]]></title><description><![CDATA[<p>Paul Müller schrieb:</p>
<blockquote>
<p>[...] Polymorphie ist auch nur mit Zeigern möglich. Was damit zusammen hängt, dass A eben kein Base ist, aber A ein Base enthält.</p>
</blockquote>
<p>Referenzen sind schon okay. Es müssen keine Zeiger sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2003854</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2003854</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 07 Jan 2011 18:45:26 GMT</pubDate></item><item><title><![CDATA[Reply to Nicht vorhanden Member der Superklasse aufrufen on Fri, 07 Jan 2011 19:53:59 GMT]]></title><description><![CDATA[<blockquote>
<p>und wieso genau machst du aus dem int nicht ein Member von Base?<br />
oder eine Virtuelle Get-Methode? zB Base::GetInt()</p>
</blockquote>
<p>Weil nur manche Subklassen von Base diesen Member haben.</p>
<blockquote>
<p>Aber gegen das kannst du dich nicht wehren:</p>
</blockquote>
<p>Du meinst, dass man auch eine Klasse schreiben kann, die kind() -&gt; 0 liefert und nicht in das Muster passt?<br />
Das werde ich nicht tun und da das Projekt keine öffentliche Lib o.ä. wird, wird das wohl auch kein anderer <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>Also gibt es außer static_cast keine Lösung?<br />
Dann werd ich den wohl benutzen oder mir was anderes einfallen lassen müssen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":/"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2003899</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2003899</guid><dc:creator><![CDATA[Wurst]]></dc:creator><pubDate>Fri, 07 Jan 2011 19:53:59 GMT</pubDate></item><item><title><![CDATA[Reply to Nicht vorhanden Member der Superklasse aufrufen on Fri, 07 Jan 2011 19:55:23 GMT]]></title><description><![CDATA[<p>Paul Müller schrieb:</p>
<blockquote>
<p>Kurz und knapp, dass geht so nicht.</p>
</blockquote>
<p>Mit einem Cast geht dass sehr wohl.</p>
<p>Paul Müller schrieb:</p>
<blockquote>
<p>Diese kennen aber die Eigenschaften, die sie von Base geerbt haben.</p>
</blockquote>
<p>Aber nicht alle...</p>
<p>Paul Müller schrieb:</p>
<blockquote>
<p>Polymorphie ist auch nur mit Zeigern möglich.</p>
</blockquote>
<p>Kennst du die STL? Solange die abgeleiteten Klassen nicht zusätzlichen Speicher benötigen, und durch pImpl ist das geht überall, sind nicht einmal Referenzen notwendig.</p>
<p>Paul Müller schrieb:</p>
<blockquote>
<p>[...] das<strong>s</strong> geht so nicht [...] auch [...] auch [...] macht Sinn [...] auch [...]</p>
</blockquote>
<p>Dein schönes Deutsch macht auch viel Sinn.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2003901</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2003901</guid><dc:creator><![CDATA[vonundzuknapp]]></dc:creator><pubDate>Fri, 07 Jan 2011 19:55:23 GMT</pubDate></item><item><title><![CDATA[Reply to Nicht vorhanden Member der Superklasse aufrufen on Fri, 07 Jan 2011 20:03:50 GMT]]></title><description><![CDATA[<p>Wurst schrieb:</p>
<blockquote>
<p>Also gibt es außer static_cast keine Lösung?<br />
Dann werd ich den wohl benutzen oder mir was anderes einfallen lassen müssen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":/"
      alt="😕"
    /></p>
</blockquote>
<p>Die Lösungen wurden schon genannt (je weiter oben, desto besser):</p>
<ol>
<li>Überdenken des Designs. Das Problem kommt mir sinnlos vor.</li>
<li>Zusätzliche virtuelle Funktion</li>
<li>Cast: static_cast oder dynamic_cast</li>
</ol>
<p>Wurst schrieb:</p>
<blockquote>
<p>Das werde ich nicht tun und da das Projekt keine öffentliche Lib o.ä. wird, wird das wohl auch kein anderer</p>
</blockquote>
<p>Aber lass dir gesagt sein: davon sollte man immer ausgehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2003906</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2003906</guid><dc:creator><![CDATA[theoraxis]]></dc:creator><pubDate>Fri, 07 Jan 2011 20:03:50 GMT</pubDate></item><item><title><![CDATA[Reply to Nicht vorhanden Member der Superklasse aufrufen on Fri, 07 Jan 2011 20:12:21 GMT]]></title><description><![CDATA[<blockquote>
<p>Zusätzliche virtuelle Funktion</p>
</blockquote>
<p>Ich sag ja, das würde nicht so funktionieren, weil ein Teil der Subklassen von Base diesen Member nicht hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2003910</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2003910</guid><dc:creator><![CDATA[wurst]]></dc:creator><pubDate>Fri, 07 Jan 2011 20:12:21 GMT</pubDate></item><item><title><![CDATA[Reply to Nicht vorhanden Member der Superklasse aufrufen on Fri, 07 Jan 2011 20:54:16 GMT]]></title><description><![CDATA[<p>wurst schrieb:</p>
<blockquote>
<blockquote>
<p>Zusätzliche virtuelle Funktion</p>
</blockquote>
<p>Ich sag ja, das würde nicht so funktionieren, weil ein Teil der Subklassen von Base diesen Member nicht hat.</p>
</blockquote>
<p>Die brauchen ihn ja auch nicht zu haben. Die geben da einfach 0 oder sowas zurück.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2003927</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2003927</guid><dc:creator><![CDATA[theoraxis]]></dc:creator><pubDate>Fri, 07 Jan 2011 20:54:16 GMT</pubDate></item><item><title><![CDATA[Reply to Nicht vorhanden Member der Superklasse aufrufen on Fri, 07 Jan 2011 21:06:45 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich sag ja, das würde nicht so funktionieren, weil ein Teil der Subklassen von Base diesen Member nicht hat.</p>
</blockquote>
<p>Zwischenklasse, die von Base erbt, diesen Member deklariert und von der dieser Teil der Subklassen erbt. Als Parameter-Typ nimmst du dann die Zwischenklasse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2003933</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2003933</guid><dc:creator><![CDATA[wx++]]></dc:creator><pubDate>Fri, 07 Jan 2011 21:06:45 GMT</pubDate></item></channel></rss>