<?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[Pure Function Handler wird aufgerufen]]></title><description><![CDATA[<p>Hallo!</p>
<p>In einer bestehenden Klassenstruktur musste ich eine Klasse hinzufügen, und lande jetzt im Pure Function Handler, sprich, eine virtuelle Funktion wurde nicht richtig überschrieben.<br />
Der Compiler warnt dabei nicht - es kommt zu einem Laufzeitfehler.</p>
<p>Ich habe versucht das ganze möglichst simpel nachzubauen, allerdings klappt es in dem Beispiel richtig.<br />
Meine Frage: Ist das ganze so richtig, oder ist da ein Fehler drinnen?<br />
Leider ist das Design unnötig kompliziert, die Container Basisklasse hat einen Member mit Referenz auf die Basisklasse des Datentypen. Diese Referenz verweist dann auf einen Member der Container Realisierung.<br />
In der Realisierung des Container Typs muss ich nun den Datentypen dem CTOR der Container Basisklasse übergeben.<br />
Ist das so überhaupt erlaubt?</p>
<p>Code siehe unten:</p>
<pre><code>// Datentyp: abstrakte Basis + abgeleitete Realisierung
// Basis
class BasisDatentyp
{
public:
	virtual void foo()=0;
};

// Realisierung
class AbgeleitetDatentyp : public BasisDatentyp
{
public:
	virtual void foo()
	{
		printf(&quot;AbgeleitetDatentyp::foo&quot;);
	}
};

// Container: Basis + abgeleitete Realisierung
// Basis
class BasisContainer
{
public:
	BasisContainer(BasisDatentyp&amp; arg):m_Datentyp(arg){}
	virtual void CallFoo(){m_Datentyp.foo();}

private:
	BasisDatentyp&amp; m_Datentyp; // Referenz
};

// Abgeleitet
class AbgeleitetContainer : public BasisContainer
{
public:
	AbgeleitetContainer():BasisContainer(m_DatentypAbgeleitet){} // ist das erlaubt???

private:
	AbgeleitetDatentyp m_DatentypAbgeleitet;

};

// main
int main(int,char**)
{

	BasisContainer *container = new AbgeleitetContainer();
	container-&gt;CallFoo();
	delete container;

	getchar();
	return 0;  
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/322162/pure-function-handler-wird-aufgerufen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 18 Jul 2026 07:19:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/322162.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 09 Dec 2013 14:01:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Pure Function Handler wird aufgerufen on Mon, 09 Dec 2013 14:01:21 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>In einer bestehenden Klassenstruktur musste ich eine Klasse hinzufügen, und lande jetzt im Pure Function Handler, sprich, eine virtuelle Funktion wurde nicht richtig überschrieben.<br />
Der Compiler warnt dabei nicht - es kommt zu einem Laufzeitfehler.</p>
<p>Ich habe versucht das ganze möglichst simpel nachzubauen, allerdings klappt es in dem Beispiel richtig.<br />
Meine Frage: Ist das ganze so richtig, oder ist da ein Fehler drinnen?<br />
Leider ist das Design unnötig kompliziert, die Container Basisklasse hat einen Member mit Referenz auf die Basisklasse des Datentypen. Diese Referenz verweist dann auf einen Member der Container Realisierung.<br />
In der Realisierung des Container Typs muss ich nun den Datentypen dem CTOR der Container Basisklasse übergeben.<br />
Ist das so überhaupt erlaubt?</p>
<p>Code siehe unten:</p>
<pre><code>// Datentyp: abstrakte Basis + abgeleitete Realisierung
// Basis
class BasisDatentyp
{
public:
	virtual void foo()=0;
};

// Realisierung
class AbgeleitetDatentyp : public BasisDatentyp
{
public:
	virtual void foo()
	{
		printf(&quot;AbgeleitetDatentyp::foo&quot;);
	}
};

// Container: Basis + abgeleitete Realisierung
// Basis
class BasisContainer
{
public:
	BasisContainer(BasisDatentyp&amp; arg):m_Datentyp(arg){}
	virtual void CallFoo(){m_Datentyp.foo();}

private:
	BasisDatentyp&amp; m_Datentyp; // Referenz
};

// Abgeleitet
class AbgeleitetContainer : public BasisContainer
{
public:
	AbgeleitetContainer():BasisContainer(m_DatentypAbgeleitet){} // ist das erlaubt???

private:
	AbgeleitetDatentyp m_DatentypAbgeleitet;

};

// main
int main(int,char**)
{

	BasisContainer *container = new AbgeleitetContainer();
	container-&gt;CallFoo();
	delete container;

	getchar();
	return 0;  
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2370740</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2370740</guid><dc:creator><![CDATA[gfsdfgdfgdfgdg]]></dc:creator><pubDate>Mon, 09 Dec 2013 14:01:21 GMT</pubDate></item><item><title><![CDATA[Reply to Pure Function Handler wird aufgerufen on Mon, 09 Dec 2013 14:09:56 GMT]]></title><description><![CDATA[<p>Streng genommen: <a href="https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Base-from-Member" rel="nofollow">https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Base-from-Member</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2370742</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2370742</guid><dc:creator><![CDATA[erlaubt]]></dc:creator><pubDate>Mon, 09 Dec 2013 14:09:56 GMT</pubDate></item><item><title><![CDATA[Reply to Pure Function Handler wird aufgerufen on Mon, 09 Dec 2013 14:18:40 GMT]]></title><description><![CDATA[<p>gfsdfgdfgdfgdg schrieb:</p>
<blockquote>
<p>In einer bestehenden Klassenstruktur musste ich eine Klasse hinzufügen, und lande jetzt im Pure Function Handler, sprich, eine virtuelle Funktion wurde nicht richtig überschrieben.</p>
</blockquote>
<p>Rufst du möglicherweise eine abstrakte Methode aus dem Basisklassenkonstruktor auf?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2370744</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2370744</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Mon, 09 Dec 2013 14:18:40 GMT</pubDate></item><item><title><![CDATA[Reply to Pure Function Handler wird aufgerufen on Mon, 09 Dec 2013 17:16:38 GMT]]></title><description><![CDATA[<p>Problem war, dass im echten Fall (nicht im einfachen Beispiel) die Übergabeparameter an die virtuellen Funktionen alle paar Wochen die Version ändern.<br />
Daher werden die Typen einfach mit #define an die aktuelle Version angepasst.</p>
<p>So in etwa:<br />
<strong>#define DatenTyp_VXX DatenTyp_V7</strong><br />
ein paar Wochen später:<br />
<strong>#define DatenTyp_VXX DatenTyp_V8</strong></p>
<p>im Code kann man dann immer DatenTyp_VXX verwenden.</p>
<p>Das ist jetzt zum Problem geworden, denn wenn man denn Typ tatsächlich hinschreibt, also in der Form DatenTyp_V8, dann gibts auch keinen pure function call mehr.</p>
<p>Möglicherweise hilft es, das #define gegen ein typedef auszutauschen.</p>
<p>Tritt in der Form jedenfalls beim Microsoft C++ Compiler auf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2370799</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2370799</guid><dc:creator><![CDATA[gfsdfgdfgdfgdg]]></dc:creator><pubDate>Mon, 09 Dec 2013 17:16:38 GMT</pubDate></item></channel></rss>