<?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[funktionszeiger: undefiniertes verhalten?]]></title><description><![CDATA[<p>hallo, ich möchte hier gerade objekt-switching implementieren. ein eintrag in der tabelle soll dabei durch eine klasse dargestellt werden, die von einer FunktionsTabellenKlasse erbt. damit der compiler nicht unnötigerweise erst in der vtable nachguckt, was er jetzt aufrufen muss, wollte ich funktionszeiger verwenden wie hier:</p>
<pre><code class="language-cpp">#include &lt;cstdio&gt;

using namespace std;

struct Base
{
	void call(int arg)
	{
		printf(&quot;Base::call()\n&quot;);
		callImpl(arg);
	}

private:
	virtual void callImpl(int arg) = 0;
};

struct ChildA : public Base
{
	void call(int arg) { callImpl(arg); }

private:
	virtual void callImpl(int) { printf(&quot;child A\n&quot;); }
};

struct ChildB : public Base
{
	void call(int arg) { callImpl(arg); }

private:
	virtual void callImpl(int) { printf(&quot;child B\n&quot;); }
};

int main()
{
	typedef void(Base::*memfun)(int);

	memfun mfA = static_cast&lt;memfun&gt;(&amp;ChildA::call);
	memfun mfB = static_cast&lt;memfun&gt;(&amp;ChildB::call);

	Base* a = new ChildA();
	Base* b = new ChildB();

	(a-&gt;*mfA)(4);
	(b-&gt;*mfB)(5);
}
</code></pre>
<p>das funktioniert auch, aber ist das erlaubt? wenigstens solange ich das passende objekt (klasse a - methode a, klasse b - methode b) verwende?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/208914/funktionszeiger-undefiniertes-verhalten</link><generator>RSS for Node</generator><lastBuildDate>Mon, 12 Oct 2026 03:01:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/208914.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 24 Mar 2008 14:27:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to funktionszeiger: undefiniertes verhalten? on Mon, 24 Mar 2008 14:27:58 GMT]]></title><description><![CDATA[<p>hallo, ich möchte hier gerade objekt-switching implementieren. ein eintrag in der tabelle soll dabei durch eine klasse dargestellt werden, die von einer FunktionsTabellenKlasse erbt. damit der compiler nicht unnötigerweise erst in der vtable nachguckt, was er jetzt aufrufen muss, wollte ich funktionszeiger verwenden wie hier:</p>
<pre><code class="language-cpp">#include &lt;cstdio&gt;

using namespace std;

struct Base
{
	void call(int arg)
	{
		printf(&quot;Base::call()\n&quot;);
		callImpl(arg);
	}

private:
	virtual void callImpl(int arg) = 0;
};

struct ChildA : public Base
{
	void call(int arg) { callImpl(arg); }

private:
	virtual void callImpl(int) { printf(&quot;child A\n&quot;); }
};

struct ChildB : public Base
{
	void call(int arg) { callImpl(arg); }

private:
	virtual void callImpl(int) { printf(&quot;child B\n&quot;); }
};

int main()
{
	typedef void(Base::*memfun)(int);

	memfun mfA = static_cast&lt;memfun&gt;(&amp;ChildA::call);
	memfun mfB = static_cast&lt;memfun&gt;(&amp;ChildB::call);

	Base* a = new ChildA();
	Base* b = new ChildB();

	(a-&gt;*mfA)(4);
	(b-&gt;*mfB)(5);
}
</code></pre>
<p>das funktioniert auch, aber ist das erlaubt? wenigstens solange ich das passende objekt (klasse a - methode a, klasse b - methode b) verwende?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1479605</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1479605</guid><dc:creator><![CDATA[fptr]]></dc:creator><pubDate>Mon, 24 Mar 2008 14:27:58 GMT</pubDate></item><item><title><![CDATA[Reply to funktionszeiger: undefiniertes verhalten? on Mon, 24 Mar 2008 15:31:55 GMT]]></title><description><![CDATA[<p>Welchen Sinn soll dein ganzes Konstrukt machen???</p>
<p>Entweder du willst statische Aufrufe oder aber dynamische (mittels virtual).<br />
Warum verwendest du Funktionszeiger, du kannst doch einfach die Methoden direkt aufrufen:</p>
<pre><code class="language-cpp">Base* a = new ChildA();
Base* b = new ChildB();

a-&gt;call(4);
b-&gt;call(5);
</code></pre>
<p>Auch das Überschreiben der Methode &quot;call&quot; in jeder abgeleiteten Klasse ergibt ja keinen Sinn, da diese ja auch nur (wie Base::call) die Methode callImpl virtuell aufrufen.</p>
<p>Oder hast du etwas Grundlegendes bei deinem Beispiel vergessen, um dein Anliegen vorzutragen? Was verstehst du jetzt genau unter &quot;Object-Switching&quot;?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1479640</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1479640</guid><dc:creator><![CDATA[~virtual]]></dc:creator><pubDate>Mon, 24 Mar 2008 15:31:55 GMT</pubDate></item><item><title><![CDATA[Reply to funktionszeiger: undefiniertes verhalten? on Mon, 24 Mar 2008 16:41:01 GMT]]></title><description><![CDATA[<p>fptr schrieb:</p>
<blockquote>
<p>das funktioniert auch, aber ist das erlaubt? wenigstens solange ich das passende objekt (klasse a - methode a, klasse b - methode b) verwende?</p>
</blockquote>
<p>ja, unter dieser Bedingung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1479674</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1479674</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 24 Mar 2008 16:41:01 GMT</pubDate></item><item><title><![CDATA[Reply to funktionszeiger: undefiniertes verhalten? on Mon, 24 Mar 2008 17:23:08 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>fptr schrieb:</p>
<blockquote>
<p>das funktioniert auch, aber ist das erlaubt? wenigstens solange ich das passende objekt (klasse a - methode a, klasse b - methode b) verwende?</p>
</blockquote>
<p>ja, unter dieser Bedingung.</p>
</blockquote>
<p>danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1479689</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1479689</guid><dc:creator><![CDATA[fptr]]></dc:creator><pubDate>Mon, 24 Mar 2008 17:23:08 GMT</pubDate></item></channel></rss>