<?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[Konvertierung in Basisklassen-Objekt]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe ein kleines Problem mit der impliziten Umwandlung eines Objekts einer abgeleiteten Klasse in ein Objekt der Basisklasse. Das ganze bezieht sich auf MFC-Klassen, aber ich denke, die eigentliche Frage ist hier möglicherweise besser aufgehoben.</p>
<p>Ich habe eine Klasse CBitmapEx von CBitmap abgeleitet, die ich gegenüber CBitmap um ein paar Methoden ergänzt habe.</p>
<p>In folgender Zeile bekomme ich dann die Fehlermeldung:<br />
&quot;error C2662: 'CBitmap::GetBitmap' : cannot convert 'this' pointer from 'const CBitmapEx' to 'CBitmap &amp;'&quot;</p>
<pre><code class="language-cpp">bRetVal = myObj-&gt;GetEmblem().GetBitmap(&amp;bmpstruct);
</code></pre>
<p>Wobei die Methode GetEmblem &quot;const CBitmapEx&amp;&quot; zurückgibt und die Methode GetBitmap() (wie die Fehlermeldung schon sagt) zu CBitmap gehört.</p>
<p>Versuche ich es stattdessen mit einem cast auf CBitmap durchsucht der Compiler die Basisklassen nach einem passenden Kopierkonstruktor und meckert, dass er keinen findet bzw. dass dieser in CObject private ist (CBitmpap stellt keinen bereit).</p>
<p>Ein Aufruf von GetBitmap über einen CBitmapEx-Zeiger funktioniert an anderer Stelle problemlos.</p>
<p>1.)<br />
Ich hätte jetzt eigentlich erwartet, dass automatisch die GetBitmap()-Methode der Basisklasse aufgerufen wird und zwar unabhängig davon, ob der Aufruf über ein CBitmapEx-Objekt oder einen CBitmapEx-Zeiger erfolgt. Warum ist das nicht der Fall?</p>
<p>2.)<br />
Da die Klasse CBitmap (genauso wie ihre Basisklassen) keinen Kopierkonstruktor bereitstellen hilft mir ein cast in diesem Fall auch gar nicht weiter, oder? Oder würde ein Kopierkonstruktor in meiner abgeleiteten Klasse CBitmapEx helfen?</p>
<p>3.)<br />
Wie sollte ich sinnvollerweise in diesem Fall vorgehen, wenn ich die Methode GetEmblem (gehört zu einer anderen Klasse, s.o.) nicht dahingehend ändern will, dass sie ein CBitmapEx* zurückgibt?</p>
<p>Ich hoffe, ich habe das einigermaßen verständlich formuliert.</p>
<p>Danke schonmal vorab!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/182185/konvertierung-in-basisklassen-objekt</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 00:49:50 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/182185.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 22 May 2007 11:25:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Konvertierung in Basisklassen-Objekt on Tue, 22 May 2007 11:25:44 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe ein kleines Problem mit der impliziten Umwandlung eines Objekts einer abgeleiteten Klasse in ein Objekt der Basisklasse. Das ganze bezieht sich auf MFC-Klassen, aber ich denke, die eigentliche Frage ist hier möglicherweise besser aufgehoben.</p>
<p>Ich habe eine Klasse CBitmapEx von CBitmap abgeleitet, die ich gegenüber CBitmap um ein paar Methoden ergänzt habe.</p>
<p>In folgender Zeile bekomme ich dann die Fehlermeldung:<br />
&quot;error C2662: 'CBitmap::GetBitmap' : cannot convert 'this' pointer from 'const CBitmapEx' to 'CBitmap &amp;'&quot;</p>
<pre><code class="language-cpp">bRetVal = myObj-&gt;GetEmblem().GetBitmap(&amp;bmpstruct);
</code></pre>
<p>Wobei die Methode GetEmblem &quot;const CBitmapEx&amp;&quot; zurückgibt und die Methode GetBitmap() (wie die Fehlermeldung schon sagt) zu CBitmap gehört.</p>
<p>Versuche ich es stattdessen mit einem cast auf CBitmap durchsucht der Compiler die Basisklassen nach einem passenden Kopierkonstruktor und meckert, dass er keinen findet bzw. dass dieser in CObject private ist (CBitmpap stellt keinen bereit).</p>
<p>Ein Aufruf von GetBitmap über einen CBitmapEx-Zeiger funktioniert an anderer Stelle problemlos.</p>
<p>1.)<br />
Ich hätte jetzt eigentlich erwartet, dass automatisch die GetBitmap()-Methode der Basisklasse aufgerufen wird und zwar unabhängig davon, ob der Aufruf über ein CBitmapEx-Objekt oder einen CBitmapEx-Zeiger erfolgt. Warum ist das nicht der Fall?</p>
<p>2.)<br />
Da die Klasse CBitmap (genauso wie ihre Basisklassen) keinen Kopierkonstruktor bereitstellen hilft mir ein cast in diesem Fall auch gar nicht weiter, oder? Oder würde ein Kopierkonstruktor in meiner abgeleiteten Klasse CBitmapEx helfen?</p>
<p>3.)<br />
Wie sollte ich sinnvollerweise in diesem Fall vorgehen, wenn ich die Methode GetEmblem (gehört zu einer anderen Klasse, s.o.) nicht dahingehend ändern will, dass sie ein CBitmapEx* zurückgibt?</p>
<p>Ich hoffe, ich habe das einigermaßen verständlich formuliert.</p>
<p>Danke schonmal vorab!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1289784</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1289784</guid><dc:creator><![CDATA[Nanuq]]></dc:creator><pubDate>Tue, 22 May 2007 11:25:44 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung in Basisklassen-Objekt on Tue, 22 May 2007 11:30:56 GMT]]></title><description><![CDATA[<p>Dein Problem hat nichts direkt mit der Vererbung zu tun, sondern mit const-correctness. Die Methode CBitmap::GetBitmap() ist nicht konstant und kann darum auch nicht über einen '<em>const</em> CBitmapEx&amp;' aufgerufen werden. Als Lösung kannst du entweder deine GetEmblem() soweit ändern, daß sie eine nicht-konstante Referenz (oder ein Objekt per Kopie) zurückgibt oder einen const_cast&lt;&gt; verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1289789</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1289789</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 22 May 2007 11:30:56 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung in Basisklassen-Objekt on Tue, 22 May 2007 11:35:26 GMT]]></title><description><![CDATA[<p>1)Kann es sein, dass die Methode GetBitmap() keine const Methode ist? Du darfst auf eine const referenz keine Methode anwenden, die diese Referenz veraendern koennte...</p>
<p>2)Ein Kopierkonstruktor koennte evtl. helfen, wenn er das zu kopierende Objekt const laesst:</p>
<pre><code class="language-cpp">CBitmapEx::CBitmapEx(const CBitmapEx&amp; other) {}...

//...

CBitmapEx tmpBitMapEx(myObj-&gt;GetEmblem());
bRetVal = tmpBitMapEx.GetBitmap(&amp;bmpstruct);
</code></pre>
<p>ein const_cast ginge vermutlich auch, ist in meinen Augen aber etwas &quot;schmutzig&quot; <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/1289794</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1289794</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 22 May 2007 11:35:26 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung in Basisklassen-Objekt on Tue, 22 May 2007 12:10:44 GMT]]></title><description><![CDATA[<p>Oje, in die komplett falsche Richtung gedacht...</p>
<p>Da ich an der Klasse, die GetEmblem() bereitstellt eigentlich nichts mehr ändern möchte, werde ich es mal über den Kopierkonstruktor probieren. Sollte ich daran scheitern, muss es halt der &quot;schmutzige&quot; Weg sein <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>Danke für die Antworten!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1289839</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1289839</guid><dc:creator><![CDATA[Nanuq]]></dc:creator><pubDate>Tue, 22 May 2007 12:10:44 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung in Basisklassen-Objekt on Tue, 22 May 2007 12:15:23 GMT]]></title><description><![CDATA[<p>Nanuq schrieb:</p>
<blockquote>
<p>Oje, in die komplett falsche Richtung gedacht...</p>
<p>Da ich an der Klasse, die GetEmblem() bereitstellt eigentlich nichts mehr ändern möchte, werde ich es mal über den Kopierkonstruktor probieren. Sollte ich daran scheitern, muss es halt der &quot;schmutzige&quot; Weg sein <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>Danke für die Antworten!</p>
</blockquote>
<p>Na - ich wüsste nicht, wie das scheitern sollte. Und wo doch, wüsste ich nicht, warum &quot;der schmutzige Weg&quot; dann funktionieren sollte. <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/1289848</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1289848</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 22 May 2007 12:15:23 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung in Basisklassen-Objekt on Tue, 22 May 2007 18:13:06 GMT]]></title><description><![CDATA[<p>Möglicherweise stelle ich mich extrem blöd an, aber ich komme tatsächlich mit den beiden von euch angegebenen Lösungsmöglichkeiten nicht weiter.</p>
<p>1.) Kopierkonstruktor für CBitmapEx<br />
Wie würde denn ein Kopierkonstruktor in diesem Fall aussehen?<br />
Normalerweise würde ich das so machen:</p>
<pre><code class="language-cpp">CBitmapEx::CBitmapEx(const CBitmapEx&amp; other)
 : CBitmap(other) // Initialisierung des Basisklassen-Subobjekts
{
    // zusätzliche Member kopieren: entfällt hier
}
</code></pre>
<p>Wie schon gesagt, gibt es allerdings in CBitmap (und den anderen &quot;Oberklassen&quot;) keinen Kopierkonstruktor, den ich in der Initialisierungsliste aufrufen könnte. (Weitere Membervariablen hat meine abgeleitete Klasse nicht).</p>
<p>2.) const_cast&lt;&gt;<br />
Ich muss zugeben, dass ich mich nicht erinnern kann, den const_cast jemals verwendet zu haben. Aber wenn ich es richtig verstanden habe, müsste es sich damit doch folgendermaßen verhalten:<br />
Meine Methode</p>
<pre><code class="language-cpp">GetEmblem()
</code></pre>
<p>liefert const CBitmapEx&amp;</p>
<pre><code class="language-cpp">const_cast&lt;CBitmapEx&gt; (myObj-&gt;GetEmblem())
</code></pre>
<p>sollte dann also ein CBitmapEx sein, da das const Attribut entfernt wurde.<br />
Demzufolge sollte die komplette Zeile dann so aussehen:</p>
<pre><code class="language-cpp">bRetVal = const_cast&lt;CBitmapEx&gt;(myObj-&gt;GetEmblem()).GetBitmap(&amp;bmpstruct);
</code></pre>
<p>Mein Compiler meint dazu:<br />
<em>error C2440: 'const_cast' : cannot convert from 'const CBitmapEx' to 'CBitmapEx'<br />
Conversion requires a constructor or user-defined-conversion operator, which can't be used by const_cast or reinterpret_cast</em><br />
Und wie ein solcher conversion-operator aussehen sollte, weiß ich dann auch wieder nicht...:(</p>
<p>Ich bin versucht, das ganze ein extrem schlechtes Design dieser MFC-Klasse zu nennen, aber ich fange vorsichtshalber mal mit der Suche bei mir selbst an ;).</p>
<p>Sollte mir hier allerdings jemand zustimmen, werde ich die Frage vielleicht noch einmal im MFC-Forum posten und hoffen, dass ich über einige MFC-Umwege vielleicht doch zum Ziel komme <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="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1290092</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1290092</guid><dc:creator><![CDATA[Nanuq]]></dc:creator><pubDate>Tue, 22 May 2007 18:13:06 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung in Basisklassen-Objekt on Tue, 22 May 2007 18:35:21 GMT]]></title><description><![CDATA[<p>Nanuq schrieb:</p>
<blockquote>
<p>aber ich fange vorsichtshalber mal mit der Suche bei mir selbst an ;).</p>
</blockquote>
<p>Ein gute Idee. const_cast kann nur für Pointer- und Referenz-casts benutzt werden. Mithin</p>
<pre><code class="language-cpp">bRetVal = const_cast&lt;CBitmapEx&amp;&gt;(myObj-&gt;GetEmblem()).GetBitmap(&amp;bmpstruct);
</code></pre>
<p>Das impliziert, dass const_cast niemals einen copy-ctor aufruft - was aber nichts mit dem Design der Klasse zu tun hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1290101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1290101</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 22 May 2007 18:35:21 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung in Basisklassen-Objekt on Tue, 22 May 2007 18:57:41 GMT]]></title><description><![CDATA[<p>Tatsache, jetzt ist mein Compiler einverstanden :), danke!</p>
<p>Mit dem schlechten Design meinte ich allerdings eigentlich die Klasse CBitmap, weil sie keinen Kopierkonstruktor bereitstellt...</p>
<p>pumuckl schrieb:</p>
<blockquote>
<p>ein const_cast ginge vermutlich auch, ist in meinen Augen aber etwas &quot;schmutzig&quot; <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>...und deswegen würde mich natürlich nach wie vor interessieren, ob bzw. wie in diesem Fall die Variante mit dem copy-ctor funktionieren würde.<br />
Weil ich es schon auch ein wenig unschön finde eine Referenz auf const zurückzugeben und nachher das const durch den cast wieder aufzuheben.</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>Als Lösung kannst du entweder deine GetEmblem() soweit ändern, daß sie eine nicht-konstante Referenz (oder ein Objekt per Kopie) zurückgibt</p>
</blockquote>
<p>Und ich meine mich zu erinnern irgendwo gelesen zu haben, dass man Objekte (d.h. keine Standarddatentypen) in Get-Methoden normalerweise per const &amp; zurückgeben sollte (Kopie sparen)...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1290118</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1290118</guid><dc:creator><![CDATA[Nanuq]]></dc:creator><pubDate>Tue, 22 May 2007 18:57:41 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung in Basisklassen-Objekt on Wed, 23 May 2007 01:17:07 GMT]]></title><description><![CDATA[<blockquote>
<p>Da ich an der Klasse, die GetEmblem() bereitstellt eigentlich nichts mehr ändern möchte</p>
</blockquote>
<p>Der einzig saubere Weg wäre IMHO CBitmap::GetBitmap const zu machen. Blöderweise hat MS das bis jetzt nicht gemacht... *g*</p>
<p>GetEmblem stattdessen zu ändern dass es einen non-const Referenz zurückgibt halte ich für einen Fehler, wieso auch, das Problem liegt ja bei CBitmap (eine Funktion die ganz klar KEIN Mutator ist ist nicht const -&gt; Fehler, pöse).</p>
<p>Ich würde hier also wahrscheinlich auch nen const_cast machen, und nen Kommentar dazuschreiben. CBitmap::GetBitmap verwendet intern bloss ::GetObject(), und mir wäre nicht bekannt dass ::GetObject an dem übergebenen Objekt was ändern darf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1290278</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1290278</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 23 May 2007 01:17:07 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung in Basisklassen-Objekt on Wed, 23 May 2007 01:22:02 GMT]]></title><description><![CDATA[<p>Sinnvoll wäre, GetBitmap zu überladen (als const Funktion) und den const_cast dort zu verstecken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1290279</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1290279</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 23 May 2007 01:22:02 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung in Basisklassen-Objekt on Wed, 23 May 2007 08:00:46 GMT]]></title><description><![CDATA[<p>hustbaer  schrieb:</p>
<blockquote>
<p>Der einzig saubere Weg wäre IMHO CBitmap::GetBitmap const zu machen. Blöderweise hat MS das bis jetzt nicht gemacht... *g*</p>
<p>GetEmblem stattdessen zu ändern dass es einen non-const Referenz zurückgibt halte ich für einen Fehler, wieso auch, das Problem liegt ja bei CBitmap (eine Funktion die ganz klar KEIN Mutator ist ist nicht const -&gt; Fehler, pöse).</p>
</blockquote>
<p>Na also! Auch wenn es mir eigentlich nicht weiterhilft, ist das doch genau das, was ich hören wollte <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="😃"
    /> -&gt; schlechtes CBitmap-Design</p>
<p>camper  schrieb:</p>
<blockquote>
<p>Sinnvoll wäre, GetBitmap zu überladen (als const Funktion) und den const_cast dort zu verstecken.</p>
</blockquote>
<p>Dann sollte ich mir allerdings absolut sicher sein, dass CBitmap::GetBitmap() an dem übergebenen Objekt wirklich nichts ändert...<br />
Werde noch einmal zusehen, dass ich das sicherstellen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1290366</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1290366</guid><dc:creator><![CDATA[Nanuq]]></dc:creator><pubDate>Wed, 23 May 2007 08:00:46 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung in Basisklassen-Objekt on Tue, 29 May 2007 18:03:53 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Sinnvoll wäre, GetBitmap zu überladen (als const Funktion) und den const_cast dort zu verstecken.</p>
</blockquote>
<p>Inzwischen habe ich das so umgesetzt.</p>
<pre><code class="language-cpp">int CBitmapEx::GetBitmap(BITMAP* pBitMap) const
{
	return const_cast&lt;CBitmapEx&amp;&gt;(*this).CBitmap::GetBitmap(pBitMap);
}
</code></pre>
<p>Da mich der Aufruf der Basisklassenmethode über den Punktoperator aber ein wenig irritiert (eigentlich irritiert mich der ganze Ausdruck ;)), wollte ich noch einmal absichern, ob das so korrekt ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1294704</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1294704</guid><dc:creator><![CDATA[Nanuq]]></dc:creator><pubDate>Tue, 29 May 2007 18:03:53 GMT</pubDate></item></channel></rss>