<?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[Problem mit Basisklassenzeiger]]></title><description><![CDATA[<p>Hier die Klassen:</p>
<pre><code class="language-cpp">class Basis
{
    public:
        virtual void Funktion(void) = 0;
};

class Abgeleitet:public Basis
{
    public:
        void Funktion(void){/*...*/};
        void Funktion2(void){/*...*/};
};
</code></pre>
<p>Ich hab folgendes Problem:</p>
<pre><code class="language-cpp">Abgeleitet Abg;
Basis* pBasis = new Abgeleitet;
pBasis = &amp;Abg;
</code></pre>
<p>pBasis-&gt;Funktion() aufzurufen ist kein Problem,aber ich will auch pBasis-&gt;Funktion2 aufrufen können. Dabei krieg ich aber immer eine Fehlermeldung.<br />
Ist das überhaupt möglich pBasis-&gt;Funktion2() aufzurufen und wenn ja wie?</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/208540/problem-mit-basisklassenzeiger</link><generator>RSS for Node</generator><lastBuildDate>Sun, 11 Oct 2026 20:37:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/208540.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 19 Mar 2008 13:54:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Basisklassenzeiger on Wed, 19 Mar 2008 13:55:04 GMT]]></title><description><![CDATA[<p>Hier die Klassen:</p>
<pre><code class="language-cpp">class Basis
{
    public:
        virtual void Funktion(void) = 0;
};

class Abgeleitet:public Basis
{
    public:
        void Funktion(void){/*...*/};
        void Funktion2(void){/*...*/};
};
</code></pre>
<p>Ich hab folgendes Problem:</p>
<pre><code class="language-cpp">Abgeleitet Abg;
Basis* pBasis = new Abgeleitet;
pBasis = &amp;Abg;
</code></pre>
<p>pBasis-&gt;Funktion() aufzurufen ist kein Problem,aber ich will auch pBasis-&gt;Funktion2 aufrufen können. Dabei krieg ich aber immer eine Fehlermeldung.<br />
Ist das überhaupt möglich pBasis-&gt;Funktion2() aufzurufen und wenn ja wie?</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1477297</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477297</guid><dc:creator><![CDATA[Programmierer]]></dc:creator><pubDate>Wed, 19 Mar 2008 13:55:04 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Basisklassenzeiger on Wed, 19 Mar 2008 13:56:57 GMT]]></title><description><![CDATA[<p>Funktion2 ist doch in Basis gar nicht definiert<br />
Wie soll das ganze dann aufgerufen werden?<br />
Du kannst lediglich von einer Instanz der Klasse Abgeleitet auf Funktion2 zugreifen.<br />
andererseits könntest du noch in Basis Funktion2 auch pure virtual definieren. Diese müsste allerdings dann wiederum in jeder abgeleiteten Klasse implementiert werden.<br />
Oder du deklarierst Funktion2 in Basis mit einem leeren Rumpf (und auch virtuell).<br />
Dann kannste dir aussuchen, ob du sie implementieren möchtest, oder nicht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1477299</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477299</guid><dc:creator><![CDATA[Vorden]]></dc:creator><pubDate>Wed, 19 Mar 2008 13:56:57 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Basisklassenzeiger on Wed, 19 Mar 2008 14:02:14 GMT]]></title><description><![CDATA[<p>(1) Speicherloch (memleak), da du eine 'Abgeleitete'-Klasseninstanz auf dem Heap und auf dem Stack erstellst. Die auf dem Heap wird nicht automatisch gelöscht und du verlierst deinen Zeiger auf den Bereich, da du pBasis umlenkst.<br />
(2) Casten.</p>
<pre><code class="language-cpp">struct foo
{
    virtual void func_first() { std::clog &lt;&lt; &quot;foo::func() called&quot; &lt;&lt; std::endl;
};

struct bar : public foo
{
    void func_first() { std::clog &lt;&lt; &quot;bar::func() called&quot; &lt;&lt; std::endl;
    void func_second() { std::clog &lt;&lt; &quot;bar::func() called&quot; &lt;&lt; std::endl;
};

int main()
{
    foo* ptr_instance(new bar);
    foo-&gt;func_first();
    static_cast&lt;bar*&gt;(ptr_instance)-&gt;func_second();
}
</code></pre>
<p>...<br />
}</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1477304</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477304</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Wed, 19 Mar 2008 14:02:14 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Basisklassenzeiger on Wed, 19 Mar 2008 14:18:30 GMT]]></title><description><![CDATA[<p>(D)Evil schrieb:</p>
<blockquote>
<p>(2) Casten.</p>
</blockquote>
<p>Aber bitte richtig. Für einen Downcast in der Hierachie sollte man dynamic_cast verwenden.</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1477312</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477312</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Wed, 19 Mar 2008 14:18:30 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Basisklassenzeiger on Wed, 19 Mar 2008 14:28:40 GMT]]></title><description><![CDATA[<p>solange foo keine virtuelle basis von bar ist und der zeiger tatsächlich auf bar zeigt, ist ein <code>static_cast</code> durchaus erlaubt.</p>
<p>aber da ich glaube, dass du das wohl weißt: solange man sich sicher ist, dass die bedingungen zutreffen, spricht imo nichts gegen den <code>static_cast</code> , wobei man sich dann natürlich die frage stellen sollte, warum überhaupt mit einem zeiger auf die basis arbeiten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1477321</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477321</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Wed, 19 Mar 2008 14:28:40 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Basisklassenzeiger on Wed, 19 Mar 2008 14:28:57 GMT]]></title><description><![CDATA[<p>(D)Evil schrieb:</p>
<blockquote>
<p>...</p>
<pre><code class="language-cpp">...
    static_cast&lt;bar*&gt;(ptr_instance)-&gt;func_second();
}
</code></pre>
<p>...<br />
}</p>
</blockquote>
<p>Naja, das funktioniert ja auch komplett ohne &quot;func_first&quot;:</p>
<pre><code class="language-cpp">struct foo
{
    virtual ~foo() {}
};

struct bar : public foo
{
    void func_second() { std::clog &lt;&lt; &quot;bar::func() called&quot; &lt;&lt; std::endl;
};

int main()
{
    foo* ptr_instance(new bar);
    static_cast&lt;bar*&gt;(ptr_instance)-&gt;func_second();
}
</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>Ich denke, die (saubere) Antwort auf die eigentliche Frage</p>
<p>Programmierer schrieb:</p>
<blockquote>
<p>...<br />
Ist das überhaupt möglich pBasis-&gt;Funktion2() aufzurufen und wenn ja wie?...</p>
</blockquote>
<p>hat Vorden eigentlich schon gegeben: Ohne virtual besser gar nicht !</p>
<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>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1477322</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477322</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 19 Mar 2008 14:28:57 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Basisklassenzeiger on Wed, 19 Mar 2008 15:18:09 GMT]]></title><description><![CDATA[<p>queer_boy schrieb:</p>
<blockquote>
<p>solange foo keine virtuelle basis von bar ist und der zeiger tatsächlich auf bar zeigt, ist ein <code>static_cast</code> durchaus erlaubt.</p>
<p>aber da ich glaube, dass du das wohl weißt: solange man sich sicher ist, dass die bedingungen zutreffen, spricht imo nichts gegen den <code>static_cast</code> , wobei man sich dann natürlich die frage stellen sollte, warum überhaupt mit einem zeiger auf die basis arbeiten?</p>
</blockquote>
<p>Aber wehe es kommen mehrere konkrete Klassen an dieser Stelle ins Spiel.<br />
Sorry, ich ziehe in dem Fall Sicherheit der Performance vor (Und sofern auch nur die Chance existiert das der Zeiger nicht auf die bei static_cast angegebene Klasse verweist, ist ein dynamic_cast definitiv der richtige Weg).<br />
Da hier durchaus auch Anfänger mitlesen, möchte ich schlicht und ergreifend vermeiden das diese mit unnötigen und schwer auffindbaren Fehlern konfrontiert werden!</p>
<p>Performance mag eine gut gemeinte Option sein, aber am Anfang sollte immer die Sicherheit gelten.</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1477349</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477349</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Wed, 19 Mar 2008 15:18:09 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Basisklassenzeiger on Wed, 19 Mar 2008 15:33:11 GMT]]></title><description><![CDATA[<p>dynamic_cast ist nicht die &quot;sichere&quot; Variante von static_cast - da liegt ein Verständnisfehler vor. Es gibt Fälle, in denen nur dynamic_cast fehlschlägt, nicht aber static_cast (man denke an nicht-virtuelle Mehrfachvererbung, bei nicht-polymorphe Klassen sowieso), und umgekehrt ebenso. Grundsätzlich haben beide Casts unterschiedliche Aufgaben, einer bedient sich statischer, der andere benutzt dynamische Typinformationen. Die Auswahl des richtigen Casts hängt folglich nicht von irgendwelchen schwer fassbaren Sicherheitskriterien ab, sondern schlicht und ergreifend von den Nebenbedingungen, die an das Argument gestellt werden können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1477364</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477364</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 19 Mar 2008 15:33:11 GMT</pubDate></item></channel></rss>