<?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[Basisklassen und Subklassen]]></title><description><![CDATA[<pre><code class="language-cpp">class Base
{
    int m_x;
    int m_y;
};

class Sub : public Base
{
    int m_z;
};
</code></pre>
<p>Es heißt ja &quot;Jedes Sub ist ein Base&quot;. Also die &gt;ist ein&lt; Beziehung.</p>
<p>Aber wenn ich sowas jetzt mache</p>
<pre><code class="language-cpp">void foo1 (const Base&amp;);
</code></pre>
<p>Und die Funktion so aufrufe</p>
<pre><code class="language-cpp">Sub SubObj;
// SubObj füllen
foo1(SubObj); // Funktioniert!?!
</code></pre>
<p>Wieso funktioniert das? Hier wird ein Base-Objekt erwartet welches nicht verändert werden darf. Dass das funktioniert ist mir klar, wegen der Ist-Ein-Beziehung, aber ich verliere doch mein <em>m_z</em> !</p>
<p>Hoffe dass ich das Problem richtig schildern konnte und mir jemand erklären könnte wieso das so funktioniert?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/268104/basisklassen-und-subklassen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 02 Sep 2026 04:03:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/268104.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 04 Jun 2010 09:54:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Basisklassen und Subklassen on Fri, 04 Jun 2010 09:54:46 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class Base
{
    int m_x;
    int m_y;
};

class Sub : public Base
{
    int m_z;
};
</code></pre>
<p>Es heißt ja &quot;Jedes Sub ist ein Base&quot;. Also die &gt;ist ein&lt; Beziehung.</p>
<p>Aber wenn ich sowas jetzt mache</p>
<pre><code class="language-cpp">void foo1 (const Base&amp;);
</code></pre>
<p>Und die Funktion so aufrufe</p>
<pre><code class="language-cpp">Sub SubObj;
// SubObj füllen
foo1(SubObj); // Funktioniert!?!
</code></pre>
<p>Wieso funktioniert das? Hier wird ein Base-Objekt erwartet welches nicht verändert werden darf. Dass das funktioniert ist mir klar, wegen der Ist-Ein-Beziehung, aber ich verliere doch mein <em>m_z</em> !</p>
<p>Hoffe dass ich das Problem richtig schildern konnte und mir jemand erklären könnte wieso das so funktioniert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1906677</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1906677</guid><dc:creator><![CDATA[Landei]]></dc:creator><pubDate>Fri, 04 Jun 2010 09:54:46 GMT</pubDate></item><item><title><![CDATA[Reply to Basisklassen und Subklassen on Fri, 04 Jun 2010 09:59:25 GMT]]></title><description><![CDATA[<p>Du verlierst m_z nicht, du kannst nur innerhalb der Funktion nicht auf m_z zugreifen. Und bei richtigem Design sollte das auch nicht notwendig sein (wenn du m_z brauchst, dann sollte der Parametertyp Sub und nicht Base sein).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1906679</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1906679</guid><dc:creator><![CDATA[Janjan]]></dc:creator><pubDate>Fri, 04 Jun 2010 09:59:25 GMT</pubDate></item><item><title><![CDATA[Reply to Basisklassen und Subklassen on Fri, 04 Jun 2010 10:00:31 GMT]]></title><description><![CDATA[<p>Janjan schrieb:</p>
<blockquote>
<p>Du verlierst m_z nicht, du kannst nur innerhalb der Funktion nicht auf m_z zugreifen. Und bei richtigem Design sollte das auch nicht notwendig sein (wenn du m_z brauchst, dann sollte der Parametertyp Sub und nicht Base sein).</p>
</blockquote>
<p>Oder man benutzt Polymorphie...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1906680</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1906680</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 04 Jun 2010 10:00:31 GMT</pubDate></item><item><title><![CDATA[Reply to Basisklassen und Subklassen on Fri, 04 Jun 2010 10:02:40 GMT]]></title><description><![CDATA[<p>Du verlierst dein m_z, aber wenn du es in der Funktion wirklich brauchst solltest du entweder zwei Funbktionen anbieten (eine für Base, eine für Sub), oder m_z gleich in die Basis ziehen.<br />
Polymorphie wird auch erst richtig interessant, wenn du mit virtuellen Funktionen arbeitest.</p>
<p>Ansonsten hast du die Möglichkeit, per dynamic_cast die Referenz auf Base in eine Referenz auf Sub zu casten (fange aber std::bad_cast auf!), dann kommst du auch wieder an dein m_z ran. Das sollte aber nur die Ausnahme sein, und kein dauerhafter &quot;Hack&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1906681</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1906681</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Fri, 04 Jun 2010 10:02:40 GMT</pubDate></item><item><title><![CDATA[Reply to Basisklassen und Subklassen on Fri, 04 Jun 2010 10:03:13 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">void foo1 (const Base&amp;);
</code></pre>
<p>bedeuted, dass die Funktion foo1 keine nicht konstanten Methoden von <code>Base</code> aufrufen kann. Die Funktion darf das Objekt also nicht verändern.<br />
Ansonsten verstehe ich nicht wirklich was Deine Frage ist. Dass man der Funktion ein <code>Sub</code> Objekt übergeben kann ist ja ganz normal und der Sinn von Polymorphie. Das hat aber nichts mit <code>const</code> zu tun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1906682</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1906682</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Fri, 04 Jun 2010 10:03:13 GMT</pubDate></item></channel></rss>