<?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[Warum ist Subtyping auch direkt für Objekte erlaubt???]]></title><description><![CDATA[<p>Hallo , lerne grade C++ (nach Pascal und Java) und komm hier nicht weiter :<br />
Warum ist Subtyping auch direkt auf den Objekten erlaubt?<br />
Dachte immer das man Subtyping nur für Zeiger erlauben sollte , da ich aber geradeam C++ lernen bin und das hier auch mit den Objekten selber geht interessiert es ich mich , was bei bestimmtem fehlerhaften Vorgehen wohl intern passiert , auch um Fehler und Fehlermeldungen besser deuten zu können.</p>
<p>Habe folgendes probiert :</p>
<p>Zahlbox1{<br />
public:<br />
Zahlbox1(){;}<br />
Zahlbox1(int in):i(in){;}<br />
int i;<br />
};</p>
<p>Zahlbox2 : public Zahlbox1{<br />
public:<br />
Zahlbox2(){;}<br />
Zahlbox2(long long in):i(in){;}<br />
long long i;<br />
};</p>
<p>Was passiert nun z.B bei :</p>
<p>Zahlbox1 z1 = Zahlbox1();<br />
z1 = Zahlbox2(123456789123456789123456789LL)</p>
<p>Da offenbar Subtying auf den Objekten selber erlaubt ist funktioniert eine<br />
Zuweisung offenbar.Was passiert aber mit dem mit viel größerem Typ überschriebenen Subklassen Attribut? Wird das bei Zuweisung einfach auf die Größe von int verstümmelt und bei Zugriff dann so interpretiert , oder kann es passieren das einfach irgendwelcher anderer Speicher über den für das Objekt reservierten hinaus überschrieben wird ?</p>
<p>Und wie verhält sich das z.B. bei Feldern?<br />
Dachte Folgendes : Ein C-Feld ist doch ein zusammengehöriger sequenzieller Bereich im Speicher , also wird dann vielleicht ein Teil des nächsten im Feld<br />
befindlichen Objekts überschrieben , wenn ich so was zu großes reinpack.</p>
<p>Mit<br />
Zahlbox1 ZF[3];<br />
ZF[0] = Zahlbox2(123456789123456789123456789LL);<br />
ZF[1] = Zahlbox1(8);<br />
ZF[2] = FZahlbox2(123456789123456789123456789LL);<br />
ZF[3] = Zahlbox1(9);</p>
<p>bekomme hier aber die richtige Ausgabe für 8,9 als würden keine Teile von anderen Objekten überschrieben , für die Zahlbox2 Objekte aber irgendwelche<br />
verschiedenen Werte. Wenn ich aber die 2 gleichen Zahlbox2 AttributWerte jetzt aber verschiedene Werte zurückbekomme ist es ja auch kaum möglich das das zu große Attribut zurecht gestutzt wurde.Dennoch wird aber wie gesagt hier scheinbar kein anderes Feldelement(oder Teile davon) überschrieben,da ich 8,9 ja richtig zurück bekomme. Stellt sich für mich also die Frage<br />
was hier genau passiert , ob einfach irgend welcher anderer Speicher überschrieben wird und wie die Speicherung von KlassenInstanzObjekte in einem (seqeunziellen) C-Array eigentlich intern aussieht.Und warum ist Subtyping auf den Objekten selbst überhaupt erlaubt(und nicht nur über Zeiger)? Danke für eure Mühe und eure<br />
Zeit.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/243224/warum-ist-subtyping-auch-direkt-für-objekte-erlaubt</link><generator>RSS for Node</generator><lastBuildDate>Sun, 20 Sep 2026 01:27:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/243224.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 14 Jun 2009 12:06:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Warum ist Subtyping auch direkt für Objekte erlaubt??? on Sun, 14 Jun 2009 12:06:06 GMT]]></title><description><![CDATA[<p>Hallo , lerne grade C++ (nach Pascal und Java) und komm hier nicht weiter :<br />
Warum ist Subtyping auch direkt auf den Objekten erlaubt?<br />
Dachte immer das man Subtyping nur für Zeiger erlauben sollte , da ich aber geradeam C++ lernen bin und das hier auch mit den Objekten selber geht interessiert es ich mich , was bei bestimmtem fehlerhaften Vorgehen wohl intern passiert , auch um Fehler und Fehlermeldungen besser deuten zu können.</p>
<p>Habe folgendes probiert :</p>
<p>Zahlbox1{<br />
public:<br />
Zahlbox1(){;}<br />
Zahlbox1(int in):i(in){;}<br />
int i;<br />
};</p>
<p>Zahlbox2 : public Zahlbox1{<br />
public:<br />
Zahlbox2(){;}<br />
Zahlbox2(long long in):i(in){;}<br />
long long i;<br />
};</p>
<p>Was passiert nun z.B bei :</p>
<p>Zahlbox1 z1 = Zahlbox1();<br />
z1 = Zahlbox2(123456789123456789123456789LL)</p>
<p>Da offenbar Subtying auf den Objekten selber erlaubt ist funktioniert eine<br />
Zuweisung offenbar.Was passiert aber mit dem mit viel größerem Typ überschriebenen Subklassen Attribut? Wird das bei Zuweisung einfach auf die Größe von int verstümmelt und bei Zugriff dann so interpretiert , oder kann es passieren das einfach irgendwelcher anderer Speicher über den für das Objekt reservierten hinaus überschrieben wird ?</p>
<p>Und wie verhält sich das z.B. bei Feldern?<br />
Dachte Folgendes : Ein C-Feld ist doch ein zusammengehöriger sequenzieller Bereich im Speicher , also wird dann vielleicht ein Teil des nächsten im Feld<br />
befindlichen Objekts überschrieben , wenn ich so was zu großes reinpack.</p>
<p>Mit<br />
Zahlbox1 ZF[3];<br />
ZF[0] = Zahlbox2(123456789123456789123456789LL);<br />
ZF[1] = Zahlbox1(8);<br />
ZF[2] = FZahlbox2(123456789123456789123456789LL);<br />
ZF[3] = Zahlbox1(9);</p>
<p>bekomme hier aber die richtige Ausgabe für 8,9 als würden keine Teile von anderen Objekten überschrieben , für die Zahlbox2 Objekte aber irgendwelche<br />
verschiedenen Werte. Wenn ich aber die 2 gleichen Zahlbox2 AttributWerte jetzt aber verschiedene Werte zurückbekomme ist es ja auch kaum möglich das das zu große Attribut zurecht gestutzt wurde.Dennoch wird aber wie gesagt hier scheinbar kein anderes Feldelement(oder Teile davon) überschrieben,da ich 8,9 ja richtig zurück bekomme. Stellt sich für mich also die Frage<br />
was hier genau passiert , ob einfach irgend welcher anderer Speicher überschrieben wird und wie die Speicherung von KlassenInstanzObjekte in einem (seqeunziellen) C-Array eigentlich intern aussieht.Und warum ist Subtyping auf den Objekten selbst überhaupt erlaubt(und nicht nur über Zeiger)? Danke für eure Mühe und eure<br />
Zeit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1726348</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1726348</guid><dc:creator><![CDATA[JohnnyDoe]]></dc:creator><pubDate>Sun, 14 Jun 2009 12:06:06 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist Subtyping auch direkt für Objekte erlaubt??? on Sun, 14 Jun 2009 12:20:23 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class Zahlbox1{
public:
Zahlbox1(){;}
Zahlbox1(int in):i(in){;}
int i;
};

class Zahlbox2 : public Zahlbox1{
public:
Zahlbox2(){;}
Zahlbox2(long long in):i(in){;}
long long i;
};
</code></pre>
<pre><code class="language-cpp">Zahlbox1 z1();
/*
Erstellt eine lokale Variable z1. Sobald die Variable ihren Socpe verliert, wird sich von der Runtime gelöscht
*/

z1 = Zahlbox2(123456789123456789123456789LL)
/* z1 erhält ein neues Objekt. Das alte wird automatisch von der
Runtime bereinigt. Vorsicht: Bei new musst du zuerst ein delete ausführen.
Regel:
  - zu jedem new gehört ein delete
  - zu jedem new[] gehört ein delete[]
*/
Zahlbox1 *z = new Zahlbox(2);
delete z;  // Kein delete führt zu einem Speicherleck, da du in der
// nächsten Zeile den Zeiger auf das Objekt verlierst.
z = new Zahlbox2(3L);
</code></pre>
<p>Mehr Informationen erhälts du unter:<br />
<a href="http://openbook.galileocomputing.de/c_von_a_bis_z/c_013_000.htm#Xxx999328" rel="nofollow">http://openbook.galileocomputing.de/c_von_a_bis_z/c_013_000.htm#Xxx999328</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1726352</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1726352</guid><dc:creator><![CDATA[Siassei]]></dc:creator><pubDate>Sun, 14 Jun 2009 12:20:23 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist Subtyping auch direkt für Objekte erlaubt??? on Sun, 14 Jun 2009 13:03:16 GMT]]></title><description><![CDATA[<p>Danke für deine Antwort, obwohl es leider nicht ganz die Antwort auf meine Fragen ist.Mit Zeigern und Objekterzeugung/Löschung kann ich ganz gut umgehen , es geht nur um den speziell beschrieben Sachverhalt des Speicherns eines Objekts selbst(nicht eines Zeigers) durch erlaubte Subtyp Polymorphie(die selsamerweise auf den Objekten selbst erlaubt ist) als Typ seiner Basisklasse und die Auswirkung dieses Sachverhalts wenn Objektattribute in der Subklasse durch größere Typen überschrieben wurden(Diese sollten dann ja nicht in den reservierten Speicher passen , bei Subytping auf den Objekten selbst).Dabei geht es mit vorallem darum was mit den nicht hineinpassenden Teilen des Attributs passiert bezüglich Speicherung und die eventuellen Auswirkungen und warum Subtyping-Polymorphie auf den Objekten selber überhaupt erlaubt ist , da ja abgeleitete Objekte meistens größer sind als Objekte der Basisklasse.Das man das normalerweise nur auf Zeigern macht ist mir schon klar.Mir geht es um die Sicht hinter den Dingen und den Sinn daran sowas überhaupt zu erlauben.Kann mir das alles was ich am Anfang des Threads genau beschrieben habe irgend jemand ganuer erklären , Speicherung oder Absägen, Auswirkungen etc.....??? Trotzdem Danke für die schnelle Antwort.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1726371</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1726371</guid><dc:creator><![CDATA[JohnnyDoe]]></dc:creator><pubDate>Sun, 14 Jun 2009 13:03:16 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist Subtyping auch direkt für Objekte erlaubt??? on Sun, 14 Jun 2009 13:32:38 GMT]]></title><description><![CDATA[<p>1. long long gibt es in Pornos und C99 aber nicht in c++ <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>2. Das Objekt der abgeleiteten Klasse wird zurechgestutzt.</p>
<p>In c++ funktioniert die Polymorphie über Zeiger und Referenzen, d.h. es ist möglich ein Objekt der abgeleiteten Klasse an eine Referenz der Basisklasse zu binden.</p>
<p>Es werden daher der Copy-Konstruktor und der Zuweisungsoperator der Basisklasse verwendet, die du selbst definiert hast bzw. der Compiler definiert hat.</p>
<p>3. Im Konstruktor von Zahlbox2 initialisiert du die Basisklasse nicht, d.h. du gibst dem Basisklassen-i keinen speziellen Wert, daher kommen auch unterschiedliche Zahlen heraus.</p>
<p>P.S.: Du kannst der Basisklasse natürlich auch spezielle Konstruktoren bzw. Zuweisungsoperatoren verpassen, die Objekte der abgeleiteten Klassen akzeptieren, dann wird es allerdings schwierig mit dem Zugriff auf die Member.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1726396</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1726396</guid><dc:creator><![CDATA[Mitleid]]></dc:creator><pubDate>Sun, 14 Jun 2009 13:32:38 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist Subtyping auch direkt für Objekte erlaubt??? on Sun, 14 Jun 2009 13:50:38 GMT]]></title><description><![CDATA[<p>Mitleid schrieb:</p>
<blockquote>
<p>1. long long gibt es in Pornos und C99 aber nicht in c++ <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>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1726407</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1726407</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 14 Jun 2009 13:50:38 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist Subtyping auch direkt für Objekte erlaubt??? on Sun, 14 Jun 2009 18:20:50 GMT]]></title><description><![CDATA[<p>Danke für deine Antwort......<br />
....also das Objekt der Basisklasse wird zurechtgestutzt.OK.<br />
Hab jetzt parallel auch gelesen dass die Vererbung über anonyme Basisklassenobjekte realisiert ist.Ich versuch mir das nur grad intern vorzustellen--&gt;Vielleicht kommt das zurechtstuzen dann daher das bei Zuweisung an den SuperklassenTyp einer Klasse die nächstinnere Klasse kopiert wird , die Äußere(abgeleitete) Klasse fällt weg...dass würde dann auch die undef. Ausgabe der Werte erklären ,denn wenn ich die Variable in der<br />
(umgebenden) abgeleiteten Klasse überschreibe würde das gleichnamige Attribut in der (inneren)Basisklasse ja nicht initialisiert und bleibt undefiniert, außer ich mach das explizit über den scope-Operator...Könnt ich das so etwa sehn oder is das falsch ,(würde sich ja in den Auswirkungen auch irgendwie mit den in der letzten Antwort beschrieben decken(stutzen..))?????????????????? <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=":confused:"
      alt="😕"
    /><br />
Warum ist Subtyping-Polymorphie in C++ für die ! Objekte selber ! dann überhaupt zugelassen ? Gibt ja auf Objekten eh nie Sinn,weil von spezielleren Objekten alles abgeschnitten wird.Wär doch viel besser Subtyping nur für Zeiger auf Typen<br />
einer Klassenhirarchie zu erlauben , oder fällt jemandem ein Grund ein, weswegen es sinvoll war , das bei der<br />
Entwicklung von C++ auch für Objekte selber zu erlauben????<br />
Naja.......aber vielleicht kann man ja doch was Tolles damit machen und es hat seine Berechtigung , und ich komm nur nich drauf........</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1726554</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1726554</guid><dc:creator><![CDATA[JohnnyDoe]]></dc:creator><pubDate>Sun, 14 Jun 2009 18:20:50 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist Subtyping auch direkt für Objekte erlaubt??? on Mon, 15 Jun 2009 03:05:42 GMT]]></title><description><![CDATA[<p>Bitte gewöhn dir ganz schnell ab das &quot;subtyping&quot; zu nennen, denn das sagt keiner und versteht auch keiner (ohne weitere Erklärungen).</p>
<p>Was du in deinem Posting als Code-Beispiel zeigst nennt man Slicing, und es ist in C++ erlaubt, weil es nunmal erlaubt ist (weil es sich aus den Regeln für Konvertierung zwischen Referenz-Typen so ergibt).</p>
<p>Und je mehr Fragezeichen und/oder Rufzeichen du an einen Satz dranschreibst... naja, das muss ich jetzt nicht erklären.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1726703</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1726703</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 15 Jun 2009 03:05:42 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist Subtyping auch direkt für Objekte erlaubt??? on Mon, 15 Jun 2009 12:54:54 GMT]]></title><description><![CDATA[<p><strong><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/20978">@JohnnyDoe</a></strong><br />
Ich muss hustbaer Recht geben. Es fällt etwas schwer zu begreifen, was du eigentlich meinst, z.B. mit <em>&quot;Subtyping-Polymorphie für die ! Objekte selber !&quot;</em></p>
<p>Also Nochmal. Du musst dir das nicht so vorstellem, dass bei einer Zuweisung sozusagen der Teil des Speicherbereiches, in welchem das Basisklassen-Objekt liegt 1:1 kopiert wird.</p>
<p>Für folgende Zuweisungen bzw. Initialisierungen</p>
<pre><code class="language-cpp">ZF[0] = Zahlbox2(123456789123456789123456789LL); //Zuweisungsoperator
ZF[2] = FZahlbox2(123456789123456789123456789LL);
//..
Zahlbox2 x;
Zahlbox1 y = x; //Copy-Konstruktor
</code></pre>
<p>sind Zuweisungsoperator bzw. Copy-Konstruktor der Basisklasse verantwortlich. Es werden also Funktionen aufgerufen.</p>
<p>Diese sehen so aus</p>
<pre><code class="language-cpp">class Zahlbox1{
public:
	Zahlbox1(){;}
	Zahlbox1(int in):i(in){;}
	Zahlbox1(const Zahlbox1&amp;);  // Copy-Konstruktor
    Zahlbox1 &amp;operator=(const Zahlbox1&amp;);  //Zuweisungsoperator 
	int i;
};
</code></pre>
<p>Und nur weil die Funktionen eine Referenz der Basisklasse erwarten, an die auch Objekte der abgeleiteten Klasse gebunden werden können funktioniert das überhaupt. D.h. es findet ein Typumwandlung statt und das resultierende Objekt hat mit Zahlbox2 nichts mehr zu tun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1726945</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1726945</guid><dc:creator><![CDATA[Mitleid]]></dc:creator><pubDate>Mon, 15 Jun 2009 12:54:54 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist Subtyping auch direkt für Objekte erlaubt??? on Mon, 15 Jun 2009 22:43:03 GMT]]></title><description><![CDATA[<p>Mitleid schrieb:</p>
<blockquote>
<pre><code class="language-cpp">123456789123456789123456789LL
</code></pre>
</blockquote>
<p>Optimist <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1727266</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1727266</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 15 Jun 2009 22:43:03 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist Subtyping auch direkt für Objekte erlaubt??? on Wed, 17 Jun 2009 13:25:24 GMT]]></title><description><![CDATA[<p>Ok. Ich denke das hat mir schon ziemlich weiter geholfen. <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="🙂"
    /> Versteh das jetz so : Für Zusammengesetzte Datentypen wie Klasse muss ich selber definieren wie das Objekt intern kopiert wird.Sowohl der Zuweisungsoperator der,falls nicht selbst implementiert, vom System erzeugt wird ,als auch analog der CopyKonstruktor nehmen beide standartmäßig Referenzen der entsprechenden Typen zu denen Sie gehören und weil Subtyping basierend auf Adressen bei zusammengestzten Typen ja problemlos funktioniert nehmen die beiden Funktionen also auch Objekte des Subtyps.Ein übergebenes Objekt wird also bei Bedarf in eine Referenz eines SuperTyps verwandelt ,diese zeigt auf das interne anonyme SuperklassenObjekt , welches das abegleitet Objekt besitzt.Damit sind in der Funtion nur Attribute des Supertyps zugreifbar.Diese werden dann bei (vom Compiler auto-generierten) Zuweisungsop.funtion oder Copykonstruktorfunktion wie gewünscht kopiert.<br />
Demnach gibts dann auch kein Sybtyping direkt auf den Objekten wie ich erst dachte,weil bei zusammenges. Typen alles intern über Referenzen läuft.Nur bei den Basistypen wird bitweise kopiert.Und die undefinerte Ausgabe die ich hatte leigt dann einfach daran , das das entsprechende Attribut des anonymen internen Superklassenobjekts nicht initialisiert wurde,letzteres wegen des gleichen verwendeten Namens für das Attribut(Überschreibung) in der(äußeren)Subklasse .<br />
Könnt ichs jetz vielleicht irgendwie verstanden haben <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=":confused:"
      alt="😕"
    /> <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/1728195</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728195</guid><dc:creator><![CDATA[JohnnyDoe]]></dc:creator><pubDate>Wed, 17 Jun 2009 13:25:24 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist Subtyping auch direkt für Objekte erlaubt??? on Wed, 17 Jun 2009 15:33:41 GMT]]></title><description><![CDATA[<p>Jup, klingt gut. Bis auf den vorletzten Satz. Es macht nichts, dass die Attribute denselben Namen haben. Die abgeleitete Klasse ist für die Initialisierung der Basisklasse und somit für den Aufruf des Basisklassenkonstruktors verantwortlich. Wenn du da nicht explizit etwas angibst, wird der Standard-Konstruktor der Basisklasse (der dann auf jeden Fall existiert) verwendet und dementsprechend sieht dann das Objekt aus.</p>
<p>Übrigens, da du ja bereits mit Java Erfahrung hast, sollte man vielleicht noch bemerken, dass das auch nur funktioniert wenn Zahlbox2 ein &quot;ist ein&quot; Verhältnis zu Zahlbox1 hat. Also, technisch gesprochen, eine public-Vererbung stattfindet.</p>
<pre><code class="language-cpp">Zahlbox2 : public Zahlbox1{};
</code></pre>
<p>Willst du die Schnittstelle der Basisklasse nicht mehr zur Verfünung stellen, indem du z.B. private oder protectet vererbst</p>
<pre><code class="language-cpp">Zahlbox2 : private Zahlbox1{};
</code></pre>
<p>dann ist eine Zuweisung bzw. Initialisierung eines Zahlbox1-Objektes mit einem Zahlbox2-Objekt auch nicht mehr möglich.</p>
<p>Tolle Sache. <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>
<p><strong><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13960">@hustbaer</a></strong><br />
Ja, hätte vielleicht mehr darauf achten sollen, was ich da kopiere. Wenigstens habe ich den &quot;Wiedererkennungswert&quot; für den Threadstarter hochgehalten. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1728315</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728315</guid><dc:creator><![CDATA[Mitleid]]></dc:creator><pubDate>Wed, 17 Jun 2009 15:33:41 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist Subtyping auch direkt für Objekte erlaubt??? on Wed, 17 Jun 2009 15:50:36 GMT]]></title><description><![CDATA[<p>Bevor ich zerfleischt werden korrigiere ich meinen Satz von</p>
<p><em>... mit einem Zahlbox2-Objekt auch nicht mehr möglich.</em></p>
<p>in</p>
<p><em>... mit einem Zahlbox2-Objekt <strong>so</strong> auch nicht mehr möglich.</em></p>
<p>Mit der erwähnten Methode der Zahlbox1-Klasse Konstruktor und Zuweisungsoperator zu verpassen, die Zahlbox2-Referenzen erwarten geht es dann natürlich wieder (eingeschränkt).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1728327</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728327</guid><dc:creator><![CDATA[Mitleid]]></dc:creator><pubDate>Wed, 17 Jun 2009 15:50:36 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist Subtyping auch direkt für Objekte erlaubt??? on Thu, 18 Jun 2009 00:21:00 GMT]]></title><description><![CDATA[<p>Ok, klar hängt die Init. der Basisklasse noch vom Basisklassenkonstruktor ab,is C++ ja diesbezüglich was Subtyping,Vererbung ,Kapselung und die Aufrufreihenfolge bei Objekterzeugung angeht Java scheinbar recht ähnlich.(Obwohl es wahrscheinlich eigentlich heißen müsste Java ist C++ ähnlich).Bei dem Zahl-Zeugs von mir sind die Werte also dann undefiniert , weil der default-Konstrukter der Basisklasse der implizit im Konstruktor der Subklasse aufgerufen auch nix anderes vorsieht ,weil er ja nicht überschrieben wurde.!??Hab ich das ungefähr richtig verstanden?Das mit dem private-Konstruktor und dem dadurch abgestellten Subtyping ist gut(sollte ja in Java auch funktionieren,denke zumindest sowas mal gelesen zu haben). Wenn ich hobbymäßig mal was in Java für mich &quot;programmiert&quot; hab hab ich Vererbung vorallem dann eingesetzt wenn es darum ging von vorhandenen Klassen zu erben z.B. bei der GUI usw. Hab halt selten irgendwelche spezielleren Features genutzt die man mit Modifiern bei Vererbung konstruieren kann,obwohl ich mich am Anfang irgendwann mal damit auseinander gesetzt hatte.<br />
Irgendwie ergibt sich schon wieder eine Frage : Ist Vererbung in C++ (nur weil in dem Buch aus dem ich lerne öfters von einem internen anonymen Basisklassenobjekt die Rede ist) tatsächlich über ein generiertes Member-Superklassen-Objekt und Delegation and dieses ,was irgendwelche Methodenaufrufe für die man den vollqualifizierenden Namen nicht mehr angeben muss angeht, realisiert ? Wie sieht das Ganze intern aus bzw. was davon ist auf SICHTBAREN Code abbildbar? Danke überigens für die bisherigen Antworten und eure Zeit.Glaube so lernt C++ sich echt effektiver als allein, vorallem weil sich keine falschen oberflächlichen Sichtweisen einprägen die wahrscheinlich ab und an zu Fehlern führen könnten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1728530</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728530</guid><dc:creator><![CDATA[JohnnyDoe]]></dc:creator><pubDate>Thu, 18 Jun 2009 00:21:00 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist Subtyping auch direkt für Objekte erlaubt??? on Thu, 18 Jun 2009 17:29:51 GMT]]></title><description><![CDATA[<p>JohnnyDoe schrieb:</p>
<blockquote>
<p>Hab ich das ungefähr richtig verstanden?</p>
</blockquote>
<p>Ich denke schon. <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>
<p>JohnnyDoe schrieb:</p>
<blockquote>
<p>Wie sieht das Ganze intern aus bzw. was davon ist auf SICHTBAREN Code abbildbar?</p>
</blockquote>
<p>Die Implemtierung des c++-Standards ist selbst nicht standardisiert. Da ist also vieles denkbar. D.h. man kann ohne Informationen des Herstellers gar nicht sagen, was unter der Haube eigentlich passiert.</p>
<p>In der Praxis dürfte jedoch alles ziemlich nahe an Stroustrups Modell sein. Dort werden die nichtstatischen Member eines Objekts zusammen mit den eventuell vorhandenen Zeigern auf sog. &quot;Virtual Tables&quot; in einem Speicherbereich zusammengesetzt. Innerhalb dieses Bereichs kann dann direkt adressiert werden (über ein Offset).</p>
<p>Der Speicherbereich eines Objekts der abgeleiteten Klasse enthält dann die Member aus der Basisklasse und daran angehängt, die Member, die durch die abgeleitete Klasse zusätzlich definiert werden. Je nachdem, wie deine Klassenhierarchie aussieht (Mehrfachverbung, virtuelle Funktionen) sind dann noch keiner, einer oder mehrere dieser Zeiger auf die jeweilige Virtual Table dabei. Es wird ebenfalls direkt adressiert.</p>
<p>Nur die virtuelle Basisklasse bei der virtuellen Vererbung bildet da ein Ausnahme. Auf die muss indirekt zugegriffen werden. Da gibt es dann auch wieder verschiedene Möglichkeiten das zu realisieren.</p>
<p>Das ist aber alles nicht in 3 oder 4 Worten erklärt. Vor allem die Vor- und Nachteile einer bestimmten Vorgehensweise. Ich kenne dummerweise auch kein Tutorial oder Link in welchem man sich schnell eine Übersicht verschaffen könnte. Vielleicht hilft einer der Kollegen aus.</p>
<p>Oder du gibst dir die entsprechende Literatur. Lippman hat da ein ganzes Buch dazu geschrieben und das eine oder andere Paper zu dem Thema geistert wohl auch herum. Wie gesagt, vielleicht kennt ein anderer Forenteilnehmer eine gute Quelle.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1728982</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728982</guid><dc:creator><![CDATA[Mitleid]]></dc:creator><pubDate>Thu, 18 Jun 2009 17:29:51 GMT</pubDate></item></channel></rss>