<?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[Vererbung]]></title><description><![CDATA[<p>Hallo leute,</p>
<p>meine Frage bezieht sich nicht direkt auf die Programmiersprache C++. Ich wusste allerdings nicht so recht wo ich die Frage stellen sollte.</p>
<p>K1 = Vorfahrenklasse, x= Objekt der Vorfahrenklasse<br />
K2 = Nachfahrenklasse, y= Objekt der Nachfahrenklasse</p>
<p>Laut meinem Prof ist folgende Zuweisung richtig: x &lt;- y<br />
Und folgende Zuweisung falsch : y &lt;- x</p>
<p>Warum ist das eine möglich und warum das andere nicht? wenn mir das einer ausführlich erklären könnte wäre echt hammer.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/326752/vererbung</link><generator>RSS for Node</generator><lastBuildDate>Fri, 10 Jul 2026 15:53:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/326752.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 05 Jul 2014 15:18:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vererbung on Sat, 05 Jul 2014 15:18:38 GMT]]></title><description><![CDATA[<p>Hallo leute,</p>
<p>meine Frage bezieht sich nicht direkt auf die Programmiersprache C++. Ich wusste allerdings nicht so recht wo ich die Frage stellen sollte.</p>
<p>K1 = Vorfahrenklasse, x= Objekt der Vorfahrenklasse<br />
K2 = Nachfahrenklasse, y= Objekt der Nachfahrenklasse</p>
<p>Laut meinem Prof ist folgende Zuweisung richtig: x &lt;- y<br />
Und folgende Zuweisung falsch : y &lt;- x</p>
<p>Warum ist das eine möglich und warum das andere nicht? wenn mir das einer ausführlich erklären könnte wäre echt hammer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2407124</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407124</guid><dc:creator><![CDATA[coc1948]]></dc:creator><pubDate>Sat, 05 Jul 2014 15:18:38 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung on Sat, 05 Jul 2014 15:25:49 GMT]]></title><description><![CDATA[<p>Kann ich nicht nachvollziehen:</p>
<pre><code class="language-cpp">struct K1 {} x;
struct K2 : K1 { void operator=(K1){} } y;
int main() {
  x=y; // ok                                                                    
  y=x; // auch ok                                                               
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2407127</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407127</guid><dc:creator><![CDATA[hammerhai]]></dc:creator><pubDate>Sat, 05 Jul 2014 15:25:49 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung on Sat, 05 Jul 2014 15:42:48 GMT]]></title><description><![CDATA[<p>Beides ist falsch, Slicing.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2407130</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407130</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sat, 05 Jul 2014 15:42:48 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung on Sat, 05 Jul 2014 16:05:17 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Beides ist falsch, Slicing.</p>
</blockquote>
<p>Nehmen wir an, wir sprechen hier mal grad für einen Momen Java: Wo wäre das dann falsch?</p>
<p>Verbung bildet eine &quot;Ist-Ein&quot; Beziehung ab. z.B. ein Kreis ist ein GeometrischesObjekt.</p>
<pre><code>class GeometryObject
{
};

class Circle : public GeometryObject
{
};

class Rectangle : public GeometryObject
{
};

int main()
{
    GeometryObject go;
    Circle C;
    Rectangle r;
}
</code></pre>
<p>Explizit in C++ (da wir hier Werttypen haben), kann nichts ohne weiteres einem der anderen 2 Objekte zugewiesen werden (in dem Beispiel).</p>
<p>Wenn wir aber Zeiger/Referenzen (Java nutzt sogenannte Referenzdatentypen, welche ein Misch-Misch aus Zeigern und Referenzen sind) nutzen, dann können wir da etwas zuweisen:</p>
<pre><code>int main()
{
    GeometryObject go;
    Circle c;
    Rectangle r;
    //---------------------
    GeometryObject &amp; cref = c; // geht ohne Problem, wie dein Prof sagt
    GeometryObject &amp; rref = r; // weil eine Kreis/Rechteck ein GeometryObject ist

    Circle &amp; refC = c; // geht
    Circle &amp; refR = r; // geht nicht, denn ein Rechteck ist kein Kreis
    Circle &amp; refFail = go; // geht auch nicht, denn niemand garantiert, dass go eine Instanz von Kreis ist.
}
</code></pre>
<p>Aber Vererbung ist noch weit komplexer. Das hier mal eben so zu erklären ist nicht möglich. Google viel, frag Leute, die es kennen und können. Und bleib neugierig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2407134</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407134</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Sat, 05 Jul 2014 16:05:17 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung on Sat, 05 Jul 2014 16:24:49 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18806">@Skym0sh0</a> , danke für die ausführliche Erklärung klingt einleuchtend</p>
<p>ich denke, dass ich das halbwegs i-wie erklären kann. Habe jetzt allerdings eine Erweiterung für diese Aufgabe.</p>
<pre><code>Vorfahrenklasse: A , Objekt x, Methode i 

Nachfahrenklasse:B , Objekt y, Methode i ( gleiche Methode nur &quot;spezialisiert&quot;)

Laut meinem Prof ist nur die Zuweisung x&lt;-y richtig. 

Nach dieser Zuweisung wird mit dem Objekt x die Methode i aufgerufen: x.i
</code></pre>
<p>Welche Methode wird ausgeführt ? und warum :S:S:S</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2407137</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407137</guid><dc:creator><![CDATA[coc1948]]></dc:creator><pubDate>Sat, 05 Jul 2014 16:24:49 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung on Sat, 05 Jul 2014 16:29:00 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>Nathan schrieb:</p>
<blockquote>
<p>Beides ist falsch, Slicing.</p>
</blockquote>
<p>Nehmen wir an, wir sprechen hier mal grad für einen Momen Java: Wo wäre das dann falsch?</p>
</blockquote>
<p>Wir sind hier aber in C++, und eine explizite Zuweisung von Objekten führt zu Slicing. Und Slicing ist doof (s.u.).</p>
<blockquote>
<p>Verbung bildet eine &quot;Ist-Ein&quot; Beziehung ab. z.B. ein Kreis ist ein GeometrischesObjekt.</p>
</blockquote>
<p>Jupp, und ein Quadrat ist ein Rechteck...</p>
<p>Edit: @vatan:<br />
Wenn mit virtual überschrieben und Referenzen/Zeiger, die aus B.<br />
Wenn mit virtual überschrieben und Objekte, die aus A (Slicing!).<br />
Wenn ohne virtual überschrieben, immer A.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2407139</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407139</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sat, 05 Jul 2014 16:29:00 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung on Sat, 05 Jul 2014 16:39:04 GMT]]></title><description><![CDATA[<p>Welche Methode ausgeführt wird, ist abhängig davon was die Variablen darstellen, und was daher die Zuweisung macht.<br />
Wenn die Variablen direkt die Objekte darstellen, dann ist <code>x</code> nach der Zuweisung immer noch ein <code>A</code> , und daher wird <code>A::i</code> ausgeführt.</p>
<p>Wenn die Variablen nur Verweise (*) auf Objekte darstellen, dann verweist x nach der Zuweisung auf das selbe Objekt wie <code>y</code> , also ein <code>B</code> .<br />
Dann wiederrum ist es abhängig davon ob die Funktion <code>i</code>  <code>virtual</code> ist oder nicht. Wenn sie <code>virtual</code> ist, dann wird <code>B::i</code> ausgeführt. Sonst auch wieder <code>A::i</code> , nur halt auf einem <code>B</code> Objekt.</p>
<p>*: Mit &quot;Verweis&quot; meine ich hier nicht ein C++ &quot;reference&quot; -- weswegen ich auch nicht das Wort &quot;Referenz&quot; oder &quot;reference&quot; verwendet habe. Ich meine damit sowas wie Zeiger in C++, oder Referenzen in Java oder C#.<br />
Bei denen wird bei der Zuweisung dann nur der Verweis geändert, die Objekte selbst bleiben unverändert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2407141</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407141</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 05 Jul 2014 16:39:04 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung on Sat, 05 Jul 2014 16:34:36 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Wir sind hier aber in C++, und eine explizite Zuweisung von Objekten führt zu Slicing.<br />
...<br />
Wenn mit virtual überschrieben und <strong>Referenzen</strong>/Zeiger, die aus B.</p>
</blockquote>
<p>Wenn es um C++ geht, und x eine Referenz auf ein A ist, dann kommt es hier auch zu Slicing.<br />
Es wird nach der Zuweisung also genau so A::i aufgerufen, selbst wenn i virtual ist.</p>
<p>Vorausgesetzt natürlich das vollständige Objekt auf das x ursprünglich verweisen hat war auch wirklich ein A, aber das ist ja so angegeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2407142</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407142</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 05 Jul 2014 16:34:36 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung on Sat, 05 Jul 2014 16:55:25 GMT]]></title><description><![CDATA[<p>laut prof wird die Methode in der Nachfahrenklasse also von B aufgerufen. Was allerdings in Widerspruch mit seinem Skript steht, dort ist vermerkt, dass die Methode immer aus der Klasse aufgerufen wird, in der es erzeugt wurde.</p>
<p>Und dass dort Informationen abgeschnitten werden, hat er nicht erwähnt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2407144</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407144</guid><dc:creator><![CDATA[coc1948]]></dc:creator><pubDate>Sat, 05 Jul 2014 16:55:25 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung on Sat, 05 Jul 2014 17:12:58 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Nathan schrieb:</p>
<blockquote>
<p>Wir sind hier aber in C++, und eine explizite Zuweisung von Objekten führt zu Slicing.<br />
...<br />
Wenn mit virtual überschrieben und <strong>Referenzen</strong>/Zeiger, die aus B.</p>
</blockquote>
<p>Wenn es um C++ geht, und x eine Referenz auf ein A ist, dann kommt es hier auch zu Slicing.</p>
</blockquote>
<p>Ups, hab das &quot;nach dieser Zuweisung&quot; überlesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2407145</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407145</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sat, 05 Jul 2014 17:12:58 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung on Sat, 05 Jul 2014 17:58:08 GMT]]></title><description><![CDATA[<p>vatan89 schrieb:</p>
<blockquote>
<p>laut prof wird die Methode in der Nachfahrenklasse also von B aufgerufen. Was allerdings in Widerspruch mit seinem Skript steht, dort ist vermerkt, dass die Methode immer aus der Klasse aufgerufen wird, in der es erzeugt wurde.</p>
<p>Und dass dort Informationen abgeschnitten werden, hat er nicht erwähnt.</p>
</blockquote>
<p>Ist das eine C++ Klasse/Vorlesung oder geht's um eine andere Sprache? Oder gar um objektorientiertes Programmieren im Allgemeinen?</p>
<p>ps: diese Frage wäre vermutlich in &quot;Rund um die Programmierung&quot; besser aufgehoben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2407148</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407148</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 05 Jul 2014 17:58:08 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung on Sat, 05 Jul 2014 19:51:21 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Beides ist falsch, Slicing.</p>
</blockquote>
<p>Na und?</p>
<pre><code>class graphicalObject{};
class circle : public graphicalObject{};

graphicalObject go;
circle c;

go = c;
</code></pre>
<p>sollte doch keine Probleme verursachen und richtig sein in dem Sinne, dass ich jetzt mit go ganz normal weiter arbeiten kann?!</p>
<p>Umgekehrt ist das aber (ohne Definition eines passenden Zuweisungsoperators) falsch, weil die Membervariablen nicht gefüllt werden können?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2407158</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407158</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Sat, 05 Jul 2014 19:51:21 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung on Sun, 06 Jul 2014 15:07:21 GMT]]></title><description><![CDATA[<p>[quote=&quot;Skym0sh0&quot;]</p>
<pre><code>int main()
{
    GeometryObject go;
    Circle c;
    Rectangle r;
    //---------------------
    GeometryObject &amp; cref = c; // geht ohne Problem, wie dein Prof sagt
    GeometryObject &amp; rref = r; // weil eine Kreis/Rechteck ein GeometryObject ist

    Circle &amp; refC = c; // geht
    Circle &amp; refR = r; // geht nicht, denn ein Rechteck ist kein Kreis
    Circle &amp; refFail = go; // geht auch nicht, denn niemand garantiert, dass go eine Instanz von Kreis ist.
}
</code></pre>
<pre><code>GeometryObject go;
    Circle c;
    Rectangle r;
    //---------------------
    GeometryObject &amp; cref = c; // go &lt;- c
    GeometryObject &amp; rref = r; // go &lt;- r

    Circle &amp; refC = c; // c &lt;- c
    Circle &amp; refR = r; // c &lt;- r // das kann ja nicht gehen 
    Circle &amp; refFail = go; // und hier versuchtst du dem c Objekt go zuzuweisen ja? c &lt;- go und das kann nicht funktionieren wegen Slicing oder generell unmöglich?
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2407247</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407247</guid><dc:creator><![CDATA[coc1948]]></dc:creator><pubDate>Sun, 06 Jul 2014 15:07:21 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung on Sun, 06 Jul 2014 15:41:53 GMT]]></title><description><![CDATA[<p>Belli schrieb:</p>
<blockquote>
<p>Nathan schrieb:</p>
<blockquote>
<p>Beides ist falsch, Slicing.</p>
</blockquote>
<p>Na und?</p>
<pre><code>class graphicalObject{};
class circle : public graphicalObject{};

graphicalObject go;
circle c;

go = c;
</code></pre>
<p>sollte doch keine Probleme verursachen und richtig sein in dem Sinne, dass ich jetzt mit go ganz normal weiter arbeiten kann?!</p>
<p>Umgekehrt ist das aber (ohne Definition eines passenden Zuweisungsoperators) falsch, weil die Membervariablen nicht gefüllt werden können?!</p>
</blockquote>
<p>Dir muss schon klar sein, auf welcher gedanklichen Ebene die Frage angesiedelt sein soll.</p>
<p>1. Sprachlich</p>
<pre><code class="language-cpp">class graphicalObject{};
class circle : public graphicalObject{};

graphicalObject go;
circle c;
</code></pre>
<pre><code class="language-cpp">go = c;
c = go;
</code></pre>
<p>sind syntaktisch Zuweisungen. Also muss der Compiler schauen ob es entweder einen passenden eingebauten Operator dafür gibt (offenbar nicht der Fall) oder eben eine passend Operatorüberladung existiert. Im Falle des Zuweisungsoperators muss dieser stets als nicht-statische Memberfunktion in der Klasse deklariert sein, die zum linken Operanden (statischer Typ) gehört.<br />
Da keine zusätzlichen Überladungen von uns deklariert wurden, hat der Compiler bereits implizit folgende Operatoren deklariert:</p>
<pre><code class="language-cpp">graphicalObject&amp; graphicalObject::operator=(const graphicalObject&amp;);
circle&amp; circle::operator=(const circle&amp;);
</code></pre>
<p>Bei der Zuweisung</p>
<pre><code class="language-cpp">go = c;
</code></pre>
<p>muss der Compiler also überprüfen, ob der Zuweisungsoperator</p>
<pre><code class="language-cpp">graphicalObject&amp; graphicalObject::operator=(const graphicalObject&amp;)
</code></pre>
<p>mit dem Argument c (lvalue des Typs circle) aufgerufen werden kann. Und das ist möglich, weil<br />
1. circle von graphicalObject abgeleitet ist<br />
2. diese Ableitung öffentlich ist, und<br />
3. in c genau ein Basisklassensubobjekt des Typs graphicalObject existiert (keine Mehrfachvererbung).<br />
Innerhalb des vom Compilers generierten Zuweisungsoperators werden alle korrespondierenden Basisklassen und Member (von graphicalObject, hier: keine) paarweise zugewiesen.</p>
<p>Im Falle von</p>
<pre><code class="language-cpp">c = go;
</code></pre>
<p>ist der Kandidat für die Zusweisung</p>
<pre><code class="language-cpp">circle&amp; circle::operator=(const circle&amp;);
</code></pre>
<p>aber das Argument go des Typs graphicalObject kann nicht an eine Referenz des Typs circle gebunden werden. Da keine andree passene Überladung des Zuweisungsoperators existiert, muss diese Zuweisung fehlschlagen.</p>
<p>2. Logisch<br />
Das Ergebnis einer Zuweisung sollte ein Objekt sein, dessen Zustand äquivalent zu dem des ursprünglichen Objektes ist.<br />
In</p>
<pre><code class="language-cpp">go = c;
</code></pre>
<p>ist das offenbar nicht der Fall, denn das Objekt go ist auch nach der Zuweisung kein circle-Objekt, sondern eben nur eine Kopie des in c enthaltenen Teilobjektes.</p>
<p>Belli schrieb:</p>
<blockquote>
<pre><code>class graphicalObject{};
class circle : public graphicalObject{};

graphicalObject go;
circle c;

go = c;
</code></pre>
<p>sollte doch keine Probleme verursachen und richtig sein in dem Sinne, dass ich jetzt mit go ganz normal weiter arbeiten kann?!</p>
</blockquote>
<p>Niemand hier weiss, was für dich normal und problemlos ist. Das hat offenbar etwas damit zu tun, wass <em>du</em> von dem Code erwartest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2407250</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407250</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 06 Jul 2014 15:41:53 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung on Sun, 06 Jul 2014 18:00:23 GMT]]></title><description><![CDATA[<p>Tja, da hast Du sehr schön, ausführlich und verständlich dargelegt, was ich mit einem einzigen Satz abgetan habe.<br />
Und <em>mir</em> war natürlich klar, dass nach</p>
<pre><code>go = c;
</code></pre>
<p>go kein circle ist und sein kann ... und eigentlich hätte ich erwartet, dass das jedem klar ist, schließlich ist und bleibt go vom Typ graphicalObject.<br />
Für mich ist diese Zuweisung im Sinne des Fragestellers richtig, weil ich danach mit meinem go machen kann, was ich mit jedem Objekt vom Typ graphicalObject machen kann.<br />
Natürlich ist klar, dass es zu Slicing kommt, ich halte das aber nicht für relevant, weil mein Objekt go genau so aussieht, als wenn ich ihm die entsprechenden Attribute von c durch Initialisierung oder Memberfunktionen mitgegeben hätte, statt durch Zuweisung von c ...<br />
Also, es muss natürlich klar sein, dass go ein graphicalObject ist und bleibt, deswegen funktioniert der umgekehrte Weg ja auch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2407267</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407267</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Sun, 06 Jul 2014 18:00:23 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung on Sun, 06 Jul 2014 23:35:29 GMT]]></title><description><![CDATA[<blockquote>
<p>Im Falle von</p>
<pre><code>c = go;
</code></pre>
<p>ist der Kandidat für die Zusweisung</p>
<pre><code>circle&amp; circle::operator=(const circle&amp;);
</code></pre>
<p>aber das Argument go des Typs graphicalObject kann nicht an eine Referenz des Typs circle gebunden werden. Da keine andree passene Überladung des Zuweisungsoperators existiert, muss diese Zuweisung fehlschlagen.</p>
</blockquote>
<p>ok, das habe ich etwas verstanden. Könntest du genau das noch einmal weniger fachlich erklären, mit ganz banalen Worten ohne Überladung und Zuweisungsoperator. Wäre das möglich :S</p>
<p>Ich weiß ich streng euch etwas an aber ich würde das gerne zu 100% verstehen und ich bin nah dran hab ich das Gefühl</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2407316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407316</guid><dc:creator><![CDATA[coc1948]]></dc:creator><pubDate>Sun, 06 Jul 2014 23:35:29 GMT</pubDate></item></channel></rss>