<?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[Wurde Methode überschrieben?]]></title><description><![CDATA[<p>Ist es möglich herauszufinden ob eine Memberfunktion von einerabgeleiteten Klasse überschrieben wurde?</p>
<p>Ist es irgendwie möglich einen Methodenzeiger zu bekommen wenn man ein Objekt hat? Also nur den Methodenzeiger in der Vtable nachzuschlagen aber nicht aufzurufen? Dann wäre es nämlich möglich durch einen Vergleich mit dem Methodenzeiger der Basisklasse zu bestimmen ob eine Methode überschrieben wurde.</p>
<p>Notfals macht es auch ein Hack. Muss nicht portable sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/161537/wurde-methode-überschrieben</link><generator>RSS for Node</generator><lastBuildDate>Fri, 11 Sep 2026 21:41:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/161537.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 07 Oct 2006 19:30:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wurde Methode überschrieben? on Sat, 07 Oct 2006 19:30:42 GMT]]></title><description><![CDATA[<p>Ist es möglich herauszufinden ob eine Memberfunktion von einerabgeleiteten Klasse überschrieben wurde?</p>
<p>Ist es irgendwie möglich einen Methodenzeiger zu bekommen wenn man ein Objekt hat? Also nur den Methodenzeiger in der Vtable nachzuschlagen aber nicht aufzurufen? Dann wäre es nämlich möglich durch einen Vergleich mit dem Methodenzeiger der Basisklasse zu bestimmen ob eine Methode überschrieben wurde.</p>
<p>Notfals macht es auch ein Hack. Muss nicht portable sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1151174</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1151174</guid><dc:creator><![CDATA[Ben04]]></dc:creator><pubDate>Sat, 07 Oct 2006 19:30:42 GMT</pubDate></item><item><title><![CDATA[Reply to Wurde Methode überschrieben? on Sat, 07 Oct 2006 19:33:42 GMT]]></title><description><![CDATA[<p>Ben04 schrieb:</p>
<blockquote>
<p>Ist es möglich herauszufinden ob eine Memberfunktion von einerabgeleiteten Klasse überschrieben wurde?</p>
</blockquote>
<p>Nö.</p>
<blockquote>
<p>Ist es irgendwie möglich einen Methodenzeiger zu bekommen wenn man ein Objekt hat? Also nur den Methodenzeiger in der Vtable nachzuschlagen aber nicht aufzurufen?</p>
</blockquote>
<p>Nö. Das ist implementierungsspezifisch.</p>
<blockquote>
<p>Notfals macht es auch ein Hack. Muss nicht portable sein.</p>
</blockquote>
<p>Hmm. Hol Dir einen Zeiger auf das gegebene Objekt und schau Dir in einem Debugger die Bytes an, die am Anfang stehen. Die kannst Du im Debugger ja dann mit Speicheradressen vergleichen um zu sehen, ob sie auf Methoden zeigen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1151175</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1151175</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Sat, 07 Oct 2006 19:33:42 GMT</pubDate></item><item><title><![CDATA[Reply to Wurde Methode überschrieben? on Sun, 08 Oct 2006 08:58:47 GMT]]></title><description><![CDATA[<blockquote>
<p>Ist es möglich herauszufinden ob eine Memberfunktion von einerabgeleiteten Klasse überschrieben wurde?</p>
</blockquote>
<p>wenn folgendes gilt:<br />
a) du kennst die Signatur und den Namen der Methode<br />
b) die Methode und alle eventuellen Überschreibungen sind public<br />
c) du kennst den genauen Typ der Klasse für die du die Nachfrage stellst<br />
dann geht sowas:</p>
<pre><code class="language-cpp">struct X {
	virtual void x() {}
	virtual ~X() {}
};

struct Y : X {
public:
	virtual void x() {}
};

struct Z : X {
};

template &lt;class T&gt;
struct OverridesX {
	static char test(void (T::*p)());
	template &lt;class U&gt;
	static int test(void (U::*p)());

	enum {
		value = sizeof(test(&amp;T::x)) == sizeof(char)
	};
};

int main() {
	cout &lt;&lt; OverridesX&lt;X&gt;::value &lt;&lt; endl;	// 1
	cout &lt;&lt; OverridesX&lt;Y&gt;::value &lt;&lt; endl;	// 1
	cout &lt;&lt; OverridesX&lt;Z&gt;::value &lt;&lt; endl;	// 0
}
</code></pre>
<p>Andernfalls und falls du die entsprechende Methode nicht aufrufen darfst, bist du was Standard-C++ angeht verloren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1151304</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1151304</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Sun, 08 Oct 2006 08:58:47 GMT</pubDate></item><item><title><![CDATA[Reply to Wurde Methode überschrieben? on Sun, 08 Oct 2006 09:15:31 GMT]]></title><description><![CDATA[<p>1. Warum braucht man sowas?</p>
<p>2. Wie geht das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1151312</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1151312</guid><dc:creator><![CDATA[2Fragen]]></dc:creator><pubDate>Sun, 08 Oct 2006 09:15:31 GMT</pubDate></item><item><title><![CDATA[Reply to Wurde Methode überschrieben? on Sun, 08 Oct 2006 10:54:22 GMT]]></title><description><![CDATA[<p>HumeSikkins schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>Genial, darf ich fragen woher du das hast?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1151366</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1151366</guid><dc:creator><![CDATA[babbb]]></dc:creator><pubDate>Sun, 08 Oct 2006 10:54:22 GMT</pubDate></item><item><title><![CDATA[Reply to Wurde Methode überschrieben? on Sun, 08 Oct 2006 13:31:29 GMT]]></title><description><![CDATA[<p>Wenn man nicht selber darauf kommt, dann lernt man sowas aus Modern C++ Design <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1151426</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1151426</guid><dc:creator><![CDATA[lolz]]></dc:creator><pubDate>Sun, 08 Oct 2006 13:31:29 GMT</pubDate></item><item><title><![CDATA[Reply to Wurde Methode überschrieben? on Sun, 08 Oct 2006 15:21:04 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/30712">@Hume</a> Dein Code ist aber auch nicht standard-konform da sizeof(int) != sizeof(char) nicht gegeben ist.</p>
<p>Und nein ich kenne den Type leider nicht. Ich hab nur ein upgecastetes Objekt.</p>
<blockquote>
<p>1. Warum braucht man sowas?</p>
</blockquote>
<p>Wenn man C Objekthierrachien wrappen will und dabei C Objekte weiter unterstützen muss. In reinem C++ Code sollte man sowas nicht brauchen.</p>
<p>Hab das Problem nun gelöst indem ich um das Problem herumsteuere.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1151484</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1151484</guid><dc:creator><![CDATA[Ben04]]></dc:creator><pubDate>Sun, 08 Oct 2006 15:21:04 GMT</pubDate></item><item><title><![CDATA[Reply to Wurde Methode überschrieben? on Sun, 08 Oct 2006 16:55:01 GMT]]></title><description><![CDATA[<p>Ben04 schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/30712">@Hume</a> Dein Code ist aber auch nicht standard-konform da sizeof(int) != sizeof(char) nicht gegeben ist.</p>
</blockquote>
<p>Normal verwendet man auch ein struct Dummy{ char twoChars[2] }; um zu garantieren, dass das eine größer als das andere ist. Hume wollte sicher nur etwas Platz sparen (da gewöhnliche plattformen größere ints haben).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1151531</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1151531</guid><dc:creator><![CDATA[lolz]]></dc:creator><pubDate>Sun, 08 Oct 2006 16:55:01 GMT</pubDate></item><item><title><![CDATA[Reply to Wurde Methode überschrieben? on Sun, 08 Oct 2006 17:14:50 GMT]]></title><description><![CDATA[<p>babbb schrieb:</p>
<blockquote>
<p>HumeSikkins schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>Genial, darf ich fragen woher du das hast?</p>
</blockquote>
<p>Aus meinem Kopf, deshalb kann es nicht genial sein. In der C++ Community gibt es aber sicher irgendwo ein Codeschnipsel, der die fehlende Genialität ergänzt.</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/30712">@Hume</a> Dein Code ist aber auch nicht standard-konform da sizeof(int) != sizeof(char) nicht gegeben ist.</p>
</blockquote>
<p>Das ist natürlich korrekt. Allerdings war das auch nur beispielhaft zusammengeschustert, weshalb ich auf den korrekten Weg (siehe Beitrag von lolz) verzichtet habe. Und bei diesen typedefs a la:<br />
typedef char (&amp;yes)[1];<br />
typedef char (&amp;no)[2];<br />
muss ich immer so lange über die richtige Klammerung nachdenken.</p>
<blockquote>
<p>Und nein ich kenne den Type leider nicht. Ich hab nur ein upgecastetes Objekt</p>
</blockquote>
<p>Falls es sich bei deiner Hierarchie um eine einfache Hierarchie handelt (keine virtuelle/mehrfach Vererbung) und du dich auf das Objektlayout deines Compilers verlassen kannst (sprich: der Code unportabel sein darf), dann kannst du natürlich den von dir angedeuteten Weg gehen.</p>
<p>Beispiel für einen Compiler, der vptr und vtables verwendet und bei dem der vptr immer das erste Element eines Objekts ist:</p>
<pre><code class="language-cpp">struct X {
	virtual void x() {}
	virtual ~X() {}
};

struct Y : X {
public:
	virtual void x() {}
};

struct Z : X {
};

struct VTable {
	typedef void (X::*pmf)();
	pmf arr[0];
};

bool overrides(X* obj, int virtNum) {
	static X x;
	return (*reinterpret_cast&lt;VTable**&gt;(&amp;x))-&gt;arr[virtNum]
		!= (*reinterpret_cast&lt;VTable**&gt;(obj))-&gt;arr[virtNum];
}

int main() {
	X x;
	Y y;
	Z z;
	cout &lt;&lt; overrides(&amp;x, 0) &lt;&lt; endl;	// 1
	cout &lt;&lt; overrides(&amp;y, 0) &lt;&lt; endl;	// 1
	cout &lt;&lt; overrides(&amp;z, 0) &lt;&lt; endl;	// 0	
}
</code></pre>
<blockquote>
<p>Hab das Problem nun gelöst indem ich um das Problem herumsteuere.</p>
</blockquote>
<p>Das scheint mir der bessere Weg zu sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1151544</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1151544</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Sun, 08 Oct 2006 17:14:50 GMT</pubDate></item></channel></rss>