<?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: Konstruktor für Konversion &amp;amp; abgeleitete Klasse]]></title><description><![CDATA[<p>Bitte korregiert mich, wenn ich irgendwo falsch liege:</p>
<p>Ich habe eine Klasse BASE und eine davon abgeleitete Klasse DERIVED.<br />
In der Klasse BASE ist ein operator + implementiert mit Operanden dieser Klasse (BASE).</p>
<p>Wenn ich nun zwei Typen der Klasse DERIVED addieren will (operator +) wird dazu die geerbte operator + aus BASE genutzt.<br />
Diese benötigt aber Operanden vom Typ BASE.</p>
<p>Für die Konversion habe ich in jeder Klasse einen Konstruktor mit genau einem Parameter (jeweils der anderen Klasse). Diese funktionieren auch.</p>
<p>Wenn ich nun aber addiere wird nachweislich nicht der Konstruktor genutzt und es gehen die Informationen aus der abgeleiteten Klasse verloren.</p>
<p>Wieso?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/186349/problem-konstruktor-für-konversion-amp-abgeleitete-klasse</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 08:31:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/186349.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 07 Jul 2007 19:41:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem: Konstruktor für Konversion &amp;amp; abgeleitete Klasse on Sat, 07 Jul 2007 19:41:20 GMT]]></title><description><![CDATA[<p>Bitte korregiert mich, wenn ich irgendwo falsch liege:</p>
<p>Ich habe eine Klasse BASE und eine davon abgeleitete Klasse DERIVED.<br />
In der Klasse BASE ist ein operator + implementiert mit Operanden dieser Klasse (BASE).</p>
<p>Wenn ich nun zwei Typen der Klasse DERIVED addieren will (operator +) wird dazu die geerbte operator + aus BASE genutzt.<br />
Diese benötigt aber Operanden vom Typ BASE.</p>
<p>Für die Konversion habe ich in jeder Klasse einen Konstruktor mit genau einem Parameter (jeweils der anderen Klasse). Diese funktionieren auch.</p>
<p>Wenn ich nun aber addiere wird nachweislich nicht der Konstruktor genutzt und es gehen die Informationen aus der abgeleiteten Klasse verloren.</p>
<p>Wieso?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1320378</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1320378</guid><dc:creator><![CDATA[SuhaG]]></dc:creator><pubDate>Sat, 07 Jul 2007 19:41:20 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: Konstruktor für Konversion &amp;amp; abgeleitete Klasse on Sun, 08 Jul 2007 10:25:47 GMT]]></title><description><![CDATA[<p>SuhaG schrieb:</p>
<blockquote>
<p>Ich habe eine Klasse BASE und eine davon abgeleitete Klasse DERIVED.<br />
In der Klasse BASE ist ein operator + implementiert mit Operanden dieser Klasse (BASE).</p>
</blockquote>
<p>Das sollten Referenzen sein, also operator+(const BASE&amp; lhs, const BASE&amp; rhs);</p>
<blockquote>
<p>Wenn ich nun zwei Typen der Klasse DERIVED addieren will (operator +) wird dazu die geerbte operator + aus BASE genutzt.</p>
</blockquote>
<p>Korrekt. Zumindest solange es keinen operator+ im Scope von DERIVED gibt.</p>
<blockquote>
<p>Für die Konversion habe ich in jeder Klasse einen Konstruktor mit genau einem Parameter (jeweils der anderen Klasse).</p>
</blockquote>
<p>Das ist Käse und unnötig. Eine Derived-to-Base-Konvertierung existiert in C++ implizit.</p>
<blockquote>
<p>Wenn ich nun aber addiere wird nachweislich nicht der Konstruktor genutzt</p>
</blockquote>
<p>Richtig, die Konvertierung geschieht implizit.</p>
<blockquote>
<p>und es gehen die Informationen aus der abgeleiteten Klasse verloren.</p>
</blockquote>
<p>Wenn du Value-Parameter verwendest, dann gehen die Informationen tatsächlich verloren. Was hier geschieht bezeichnet man als &quot;slicing&quot;, da der Derived-Teil abgeschnitten wird und nur der Base-Teil übrig bleibt. Das resultierende Objekt *ist* danach ein Base-Objekt.</p>
<p>Verwendest du hingegen Referenz-Parameter, siehst du zwar nur den Base-Anteil, das referenzierte Objekt ist aber nach wie vor ein Derived-Objekt. Mittels eines Casts (static_ bzw. dynamic_) kannst du weiterhin auf den Derived-Teil zugreifen.</p>
<p>Slicing ist nur selten das was man will und ein Grund dafür, warum man der Regel &quot;Make non-leaf classes abstract&quot; folgen sollte. In diesem Fall kann slicing gar nicht mehr auftreten, da Basisklassen nicht mehr instanziiert werden können.</p>
<p>Einen Operator+ in einer Hierarchie ist allerdings so oder so problematisch, es sei denn er kann problemlos ausschließlich auf dem Base-Anteil arbeiten. Andernfalls musst du dir ganz genau überlegen, was die Semantik von operator+(BaseType, DerivedType) ist und wie du dafür sorgst, dass dein op+ kommutativ bleibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1320574</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1320574</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Sun, 08 Jul 2007 10:25:47 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: Konstruktor für Konversion &amp;amp; abgeleitete Klasse on Sun, 08 Jul 2007 11:06:13 GMT]]></title><description><![CDATA[<p>Vielen Dank!</p>
<p>Habe es dank der Erläuterung nun hinbekommen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1320599</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1320599</guid><dc:creator><![CDATA[SuhaG]]></dc:creator><pubDate>Sun, 08 Jul 2007 11:06:13 GMT</pubDate></item></channel></rss>