<?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[Funktioniert Polymorphie mit memcpy ?]]></title><description><![CDATA[<p>Nehmen wir mal an A und B seien POD-Klassen:</p>
<pre><code class="language-cpp">class A abstract
{
  void f() = 0;
}
class B : public A
{
   void f();
}

main
{
  A * a = new B;
  void * ptr = ausreichend_speicher;
  memcpy ( ptr, a, sizeof(B) );
  A * a2 = (A*) ptr;
  //funktioniert folgendes ?
  a2-&gt;f();  
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/267959/funktioniert-polymorphie-mit-memcpy</link><generator>RSS for Node</generator><lastBuildDate>Wed, 02 Sep 2026 04:46:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/267959.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 01 Jun 2010 20:28:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktioniert Polymorphie mit memcpy ? on Tue, 01 Jun 2010 20:28:59 GMT]]></title><description><![CDATA[<p>Nehmen wir mal an A und B seien POD-Klassen:</p>
<pre><code class="language-cpp">class A abstract
{
  void f() = 0;
}
class B : public A
{
   void f();
}

main
{
  A * a = new B;
  void * ptr = ausreichend_speicher;
  memcpy ( ptr, a, sizeof(B) );
  A * a2 = (A*) ptr;
  //funktioniert folgendes ?
  a2-&gt;f();  
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1905674</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1905674</guid><dc:creator><![CDATA[C-Umsteiger]]></dc:creator><pubDate>Tue, 01 Jun 2010 20:28:59 GMT</pubDate></item><item><title><![CDATA[Reply to Funktioniert Polymorphie mit memcpy ? on Tue, 01 Jun 2010 20:42:52 GMT]]></title><description><![CDATA[<p>Ich denke mal, dass es (meist) funktioniert, da ja lediglich ein byteweise Kopie erstellt wird. Allerdings habe ich da eher so eine Vermutung, dass es nicht definiert ist, was ich aber im Standard nachschlagen müsste.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1905681</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1905681</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 01 Jun 2010 20:42:52 GMT</pubDate></item><item><title><![CDATA[Reply to Funktioniert Polymorphie mit memcpy ? on Tue, 01 Jun 2010 20:54:14 GMT]]></title><description><![CDATA[<p>Das mag in der Praxis funktionieren, aber ich gehe stark davon aus, dass das undefiniertes Verhalten ist. Denn ich bin mir ziemlich sicher, dass nirgendwo im Standard festgelegt ist, dass Polymorphismus durch vtables implementiert werden muss. Wenn ich mir jetzt also in meinem C++-Compiler eine andere Technik überlege, siehst du alt aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1905687</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1905687</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Tue, 01 Jun 2010 20:54:14 GMT</pubDate></item><item><title><![CDATA[Reply to Funktioniert Polymorphie mit memcpy ? on Tue, 01 Jun 2010 20:54:23 GMT]]></title><description><![CDATA[<p>warum nicht einfach</p>
<pre><code class="language-cpp">class A abstract
{
  void f() = 0;
  A* create() = 0;
}
class B : public A
{
   void f();
   A* create(){return new B(this);}
}

main
{
  A * a = new B;
  A * a2 = (A*) B.create();
  //funktioniert folgendes ?
  a2-&gt;f();  
}
</code></pre>
<p>oder übersehe ich da einen Sinn vom memcpy?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1905688</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1905688</guid><dc:creator><![CDATA[BigNeal]]></dc:creator><pubDate>Tue, 01 Jun 2010 20:54:23 GMT</pubDate></item><item><title><![CDATA[Reply to Funktioniert Polymorphie mit memcpy ? on Tue, 01 Jun 2010 21:04:16 GMT]]></title><description><![CDATA[<p>B ist kein POD, da es von A erbt.<br />
Ich denke, Dein memcpy läuft daher auf undefiniertes Verhalten hinaus.<br />
Es gibt dann eventuell noch ein Alignment-Problem.</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1905691</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1905691</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 01 Jun 2010 21:04:16 GMT</pubDate></item><item><title><![CDATA[Reply to Funktioniert Polymorphie mit memcpy ? on Tue, 01 Jun 2010 21:07:35 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>B ist kein POD, da es von A erbt.</p>
</blockquote>
<p>A ist auch kein POD. Virtuelle Funktionen oder gar abstrakte Klassen gehen gar nicht.<br />
Allerdings wollte er das ja abgesehen davon wissen (darum &quot;angenommen A und B..&quot;).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1905692</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1905692</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 01 Jun 2010 21:07:35 GMT</pubDate></item><item><title><![CDATA[Reply to Funktioniert Polymorphie mit memcpy ? on Tue, 01 Jun 2010 21:07:47 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>B ist kein POD, da es von A erbt.<br />
Ich denke, Dein memcpy läuft daher auf undefiniertes Verhalten hinaus.<br />
Es gibt dann eventuell noch ein Alignment-Problem.</p>
</blockquote>
<p>Ach, A soll wohl auch noch eine pur-virtuelle Funkion enthalten, was? Das ist dann schon lange kein POD mehr. Du hast dann aber das &quot;virtual&quot; keyword vergessen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1905694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1905694</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 01 Jun 2010 21:07:47 GMT</pubDate></item><item><title><![CDATA[Reply to Funktioniert Polymorphie mit memcpy ? on Tue, 01 Jun 2010 21:15:57 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>B ist kein POD, da es von A erbt.<br />
Ich denke, Dein memcpy läuft daher auf undefiniertes Verhalten hinaus.<br />
Es gibt dann eventuell noch ein Alignment-Problem.</p>
</blockquote>
<p>Ach, A soll wohl auch noch eine pur-virtuelle Funkion enthalten, was? Das ist dann schon lange kein POD mehr. Du hast dann aber das &quot;virtual&quot; keyword vergessen.</p>
</blockquote>
<p>Ich denke er wollte da in der Tat eine abstrakte Klasse, daher das &quot;abstract&quot; (was so natürlich syntaktisch völlig falsch ist, aber der Rest ist ja auch nicht korrekt).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1905695</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1905695</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 01 Jun 2010 21:15:57 GMT</pubDate></item><item><title><![CDATA[Reply to Funktioniert Polymorphie mit memcpy ? on Wed, 02 Jun 2010 18:20:15 GMT]]></title><description><![CDATA[<p>Das obige Beispiel mag jetzt nicht stilitisch einwandfrei sein, ich bitte darüber hinweg zu sehen.<br />
Scheinbar bedeutet der Begriff POD nicht genau das was ich meinte.<br />
A und B seien flache Objekte, haben keine Pointer als member.</p>
<p>Mein Kernproblem ist im Grunde aber folgendes. Die Klasse B wird memcpy serialisiert und an einen anderen Prozess übertragen. Bedeutet es existiert im zweiten Prozess eine fertiges B-Objekt im Speicher.<br />
Ich benötige nur noch einen korrekten (polymorphen) A-Zeiger auf dieses Objekt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1906062</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1906062</guid><dc:creator><![CDATA[C-Umsteiger]]></dc:creator><pubDate>Wed, 02 Jun 2010 18:20:15 GMT</pubDate></item><item><title><![CDATA[Reply to Funktioniert Polymorphie mit memcpy ? on Wed, 02 Jun 2010 18:37:27 GMT]]></title><description><![CDATA[<p>C-Umsteiger schrieb:</p>
<blockquote>
<p>Mein Kernproblem ist im Grunde aber folgendes. Die Klasse B wird memcpy serialisiert und an einen anderen Prozess übertragen. Bedeutet es existiert im zweiten Prozess eine fertiges B-Objekt im Speicher.<br />
Ich benötige nur noch einen korrekten (polymorphen) A-Zeiger auf dieses Objekt.</p>
</blockquote>
<p>Polymorphie und <code>memcpy()</code> sind unvereinbar. Sobald du virtuelle Funktionen einsetzt, ist deine Klasse kein POD mehr, wodurch aus sämtlichen bitweisen Operationen im Speicher undefiniertes Verhalten resultiert.</p>
<p>Auf dein Beispiel angewandt heisst das, du darfst gar nie mit <code>memcpy()</code> serialisieren. Warum verwendest du nicht den Kopierkonstruktor?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1906068</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1906068</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 02 Jun 2010 18:37:27 GMT</pubDate></item><item><title><![CDATA[Reply to Funktioniert Polymorphie mit memcpy ? on Wed, 02 Jun 2010 18:38:55 GMT]]></title><description><![CDATA[<p>C-Umsteiger schrieb:</p>
<blockquote>
<p>Die Klasse B wird memcpy serialisiert und an einen anderen Prozess übertragen. Bedeutet es existiert im zweiten Prozess eine fertiges B-Objekt im Speicher.<br />
Ich benötige nur noch einen korrekten (polymorphen) A-Zeiger auf dieses Objekt.</p>
</blockquote>
<p>Das geht dann garantiert nicht mehr. Prozessintern mag's vielleicht noch funktionieren, aber sobald du polymorphe Objekte hast, haben die auch einen vtable-Zeiger und den kannst du nicht kopieren (bzw. kannst du schon, der bringt dir im anderen Prozess aber nichts).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1906070</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1906070</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Wed, 02 Jun 2010 18:38:55 GMT</pubDate></item><item><title><![CDATA[Reply to Funktioniert Polymorphie mit memcpy ? on Wed, 02 Jun 2010 19:16:40 GMT]]></title><description><![CDATA[<p>C-Umsteiger schrieb:</p>
<blockquote>
<p>Scheinbar bedeutet der Begriff POD nicht genau das was ich meinte.<br />
A und B seien flache Objekte, haben keine Pointer als member..</p>
</blockquote>
<p>Nein das ist es nicht.</p>
<p>Lies am besten mal das hier durch:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-194356.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-194356.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1906083</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1906083</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 02 Jun 2010 19:16:40 GMT</pubDate></item><item><title><![CDATA[Reply to Funktioniert Polymorphie mit memcpy ? on Thu, 03 Jun 2010 10:39:06 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Warum verwendest du nicht den Kopierkonstruktor?</p>
</blockquote>
<p>Daran hatte ich auch schon gedacht.<br />
Ist es möglich ausschließlich die vTable initialisieren ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1906260</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1906260</guid><dc:creator><![CDATA[C-Umsteiger]]></dc:creator><pubDate>Thu, 03 Jun 2010 10:39:06 GMT</pubDate></item><item><title><![CDATA[Reply to Funktioniert Polymorphie mit memcpy ? on Thu, 03 Jun 2010 12:18:38 GMT]]></title><description><![CDATA[<p>C-Umsteiger schrieb:</p>
<blockquote>
<p>Ist es möglich ausschließlich die vTable initialisieren ?</p>
</blockquote>
<p>Der C++ Standard verliert kein Wort über &quot;vTable&quot;. Wenn Du dahingehend etwas versuchst, wird es ein Compiler-spezifischer Hack werden, der mit der nächsten Version des Compilers schon nicht mehr funktionieren könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1906302</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1906302</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 03 Jun 2010 12:18:38 GMT</pubDate></item><item><title><![CDATA[Reply to Funktioniert Polymorphie mit memcpy ? on Thu, 03 Jun 2010 15:39:32 GMT]]></title><description><![CDATA[<p>@C-Umsteiger:<br />
Du siehst, dass es keine korrekte Möglichkeit gibt. Überleg dir besser dein Problem nochmal genau und finde eine besseren Lösungsansatz (welchen es bestimmt gibt).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1906412</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1906412</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 03 Jun 2010 15:39:32 GMT</pubDate></item></channel></rss>