<?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[Probleme mit virtuellen funktionen]]></title><description><![CDATA[<p>Hallo!<br />
Ich habe folgendes Problem:<br />
Ich habe einen Pointer auf ein Objekt, dessen Funktionalität ich während der Laufzeit ändern möchte. Er zeigt zunächst auf ein Objekt der Basisklasse, welches dann deleted werden soll und im Anschluss daran ein neues Objekt zugewiesen bekommen. also in etwa so:</p>
<p>class base;<br />
class xt:public base;<br />
base *basePointer=new base();<br />
delete basePointer;<br />
basePointer=new xt();<br />
basePointer-&gt;doSomething();</p>
<p>Wenn ich das versuche, schnallt das liebe Programm irgendetwas nicht und die vfptr-tabelle ist ungültig und somit wird die falsche virtuelle Funktion (die der base-klasse) ausgeführt.<br />
Ist an der vorgehensweise grundsätzlich etwas verkehrt/unsicher? Oder muss ich den Fehler woanders suchen und ich kann mit new und delete so umspringen wie im Beispiel?<br />
Danke und viele Grüße<br />
Sören</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/192387/probleme-mit-virtuellen-funktionen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 27 Sep 2026 10:01:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/192387.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 13 Sep 2007 17:33:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme mit virtuellen funktionen on Thu, 13 Sep 2007 17:33:47 GMT]]></title><description><![CDATA[<p>Hallo!<br />
Ich habe folgendes Problem:<br />
Ich habe einen Pointer auf ein Objekt, dessen Funktionalität ich während der Laufzeit ändern möchte. Er zeigt zunächst auf ein Objekt der Basisklasse, welches dann deleted werden soll und im Anschluss daran ein neues Objekt zugewiesen bekommen. also in etwa so:</p>
<p>class base;<br />
class xt:public base;<br />
base *basePointer=new base();<br />
delete basePointer;<br />
basePointer=new xt();<br />
basePointer-&gt;doSomething();</p>
<p>Wenn ich das versuche, schnallt das liebe Programm irgendetwas nicht und die vfptr-tabelle ist ungültig und somit wird die falsche virtuelle Funktion (die der base-klasse) ausgeführt.<br />
Ist an der vorgehensweise grundsätzlich etwas verkehrt/unsicher? Oder muss ich den Fehler woanders suchen und ich kann mit new und delete so umspringen wie im Beispiel?<br />
Danke und viele Grüße<br />
Sören</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364812</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364812</guid><dc:creator><![CDATA[soerenP]]></dc:creator><pubDate>Thu, 13 Sep 2007 17:33:47 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit virtuellen funktionen on Thu, 13 Sep 2007 17:57:22 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class base {
public:
  virtual void doSomething() {cout&lt;&lt;&quot;base&quot;&lt;&lt;endl;}
}; 
class xt : public base {
public: 
  void doSomething() {cout&lt;&lt;&quot;xt&quot;&lt;&lt;endl;} 
}; 

...
base *basePointer = new base; 
delete basePointer; 

basePointer = new xt; 
basePointer-&gt;doSomething();
</code></pre>
<p>genau so sollte es funktionieren.<br />
RTTI muss beim kompilieren aktiviert sein!!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364826</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364826</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Thu, 13 Sep 2007 17:57:22 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit virtuellen funktionen on Thu, 13 Sep 2007 18:01:19 GMT]]></title><description><![CDATA[<p>Ähhh, was ist RTTI?<br />
Muss in der xt-Klasse kein virtual stehen?<br />
Vielen Dank!<br />
Sören</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364829</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364829</guid><dc:creator><![CDATA[soerenP]]></dc:creator><pubDate>Thu, 13 Sep 2007 18:01:19 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit virtuellen funktionen on Thu, 13 Sep 2007 18:09:20 GMT]]></title><description><![CDATA[<p>Ok, weiss jetzt, was RTTI ist.<br />
In vielen Fällen habe ich schon einen pointer, der auf eine Basisklasse deklariert ist und dann ein abgeleitetes Objekt zugewiesen bekommt. Da gibt es auch keine Probleme. Die gibts nur, wenn ich vorher<br />
pt=new base()<br />
und dann<br />
delete pt;<br />
pt=new xt();<br />
mache.<br />
Es wird immer die Funktion der Baisklasse aufgerufen. Und das macht keinen Sinn für das Objekt...<br />
Grüße<br />
Sören</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364833</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364833</guid><dc:creator><![CDATA[soerenP]]></dc:creator><pubDate>Thu, 13 Sep 2007 18:09:20 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit virtuellen funktionen on Thu, 13 Sep 2007 18:14:20 GMT]]></title><description><![CDATA[<p>RTTI heißt RunTime Type Information, was soviel heißt wie: Zur Laufzeit ist der Typ bekannt. Braucht man aber eigentlich nur für dynamic_cast und typeid, nicht für virtuelle Funktionen.</p>
<p>Und virtual muss nur in der Basisklasse angegeben werden, das &quot;vererbt&quot; sich praktisch <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>
<p>e: Bist du sicher, dass du die Funktion als virtual deklariert hast?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364834</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364834</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Thu, 13 Sep 2007 18:14:20 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit virtuellen funktionen on Thu, 13 Sep 2007 18:14:01 GMT]]></title><description><![CDATA[<p>soerenP schrieb:</p>
<blockquote>
<p>Ähhh, was ist RTTI?</p>
</blockquote>
<p>RunTimeTypeInformation. Auch wenn ich in diesem Fall nicht sehe, warum das aktiviert werden müsste. Nur das in der Basisklasse ein virtueller Destruktor sein sollte (Bei Basisklassen mit wenigen Ausnahmen sinnvoll)...</p>
<p>soerenP schrieb:</p>
<blockquote>
<p>Muss in der xt-Klasse kein virtual stehen?</p>
</blockquote>
<p>Nein, das virtual wird &quot;quasi&quot; mit vererbt. Wichtig ist nur das es auf der untersten Ebene (in diesem Fall in der Klasse base) steht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364837</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364837</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 13 Sep 2007 18:14:01 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit virtuellen funktionen on Thu, 13 Sep 2007 18:18:07 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p>soerenP schrieb:</p>
<blockquote>
<p>Ähhh, was ist RTTI?</p>
</blockquote>
<p>RunTimeTypeInformation. Auch wenn ich in diesem Fall nicht sehe, warum das aktiviert werden müsste. Nur das in der Basisklasse ein virtueller Destruktor sein sollte (Bei Basisklassen mit wenigen Ausnahmen sinnvoll)...</p>
<p>soerenP schrieb:</p>
<blockquote>
<p>Muss in der xt-Klasse kein virtual stehen?</p>
</blockquote>
<p>Nein, das virtual wird &quot;quasi&quot; mit vererbt. Wichtig ist nur das es auf der untersten Ebene (in diesem Fall in der Klasse base) steht.</p>
</blockquote>
<p>hier muss es nicht aktiviert sein. sorry. ich meinte auch eher: es sollt ebei c++ eigentlich standarmäßig aktiviert sein...<br />
was den virtuellen destruktor anbelangt so sollte der bei jeder basisklasse als virtuell definiert werden (zumindest bei der allgemeinsten klasse). ansonsten löscht du beim delete *ptrBase nicht den &quot;Teil&quot; der abgeleiteten klasse.</p>
<p>bitte benutz C/C++ Tags bei den Beiträgen, das liest sich leichter.<br />
SirAnn</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364839</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364839</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Thu, 13 Sep 2007 18:18:07 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit virtuellen funktionen on Thu, 13 Sep 2007 18:27:45 GMT]]></title><description><![CDATA[<p>soerenP schrieb:</p>
<blockquote>
<p>In vielen Fällen habe ich schon einen pointer, der auf eine Basisklasse deklariert ist und dann ein abgeleitetes Objekt zugewiesen bekommt. Da gibt es auch keine Probleme. Die gibts nur, wenn ich vorher</p>
<pre><code class="language-cpp">pt=new base()
und dann 
delete pt; 
pt=new xt();
</code></pre>
<p>mache.<br />
Es wird immer die Funktion der Baisklasse aufgerufen. Und das macht keinen Sinn für das Objekt...</p>
</blockquote>
<p>Also ich habe mal ein Minibeispiel was eigentlich richtig funktionieren sollte:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class base
{
	public:
		virtual void test()
		{
			std::cout &lt;&lt; &quot;base::test()\n&quot;;
		}

		virtual ~base()
		{
			std::cout &lt;&lt; &quot;base::~base()\n&quot;;
		}
};

class child : public base
{
	public:
		void test()
		{
			std::cout &lt;&lt; &quot;child::test()\n&quot;;
		}

		~child()
		{
			std::cout &lt;&lt; &quot;child::~child()\n&quot;;
		}
};

int main()
{
	base* pBase = new base();
	pBase-&gt;test();
	delete pBase;

	pBase = new child();
	pBase-&gt;test();
	delete pBase;

	return 0;
}
</code></pre>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364843</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364843</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 13 Sep 2007 18:27:45 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit virtuellen funktionen on Thu, 13 Sep 2007 18:28:32 GMT]]></title><description><![CDATA[<p>Ok, vielen Dank für die Aufklärung!<br />
Es scheint so, als hätte das Problem sich verlagert <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="😕"
    /><br />
Auf jeden Fall wird (fragt mich nciht, was ich verändert habe!) jetzt immer die richtige Funktion aufgerufen.<br />
Sieht für mich wie ein tiefsitzendes Problem aus, das ständig seine Symptome wechselt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /><br />
Ich danke euch auf jeden fall<br />
Sören</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364844</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364844</guid><dc:creator><![CDATA[soerenP]]></dc:creator><pubDate>Thu, 13 Sep 2007 18:28:32 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit virtuellen funktionen on Thu, 13 Sep 2007 18:33:25 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p>...RunTimeTypeInformation. Auch wenn ich in diesem Fall nicht sehe, warum das aktiviert werden müsste.</p>
</blockquote>
<p>muffmolch schrieb:</p>
<blockquote>
<p>hier muss es nicht aktiviert sein. sorry. ich meinte auch eher: es sollt ebei c++ eigentlich standarmäßig aktiviert sein...</p>
</blockquote>
<p>Jein, wenn ich es nicht brauche sehe ich keinen Grund warum ich es nicht deaktivieren kann, wenn gleich der Overhead wohl nicht so enorm ist (anders sieht es beim Exceptionhandling auf alten Compilern aus, wo ohne Einbau eines try/catch-blockes sich der Code bis zu 100% aufbläht - aus eigener Erfahrung).</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364851</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364851</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 13 Sep 2007 18:33:25 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit virtuellen funktionen on Thu, 13 Sep 2007 18:36:02 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p>Jein, wenn ich es nicht brauche sehe ich keinen Grund warum ich es nicht deaktivieren kann, wenn gleich der Overhead wohl nicht so enorm ist (anders sieht es beim Exceptionhandling auf alten Compilern aus, wo ohne Einbau eines try/catch-blockes sich der Code bis zu 100% aufbläht - aus eigener Erfahrung).cu André</p>
</blockquote>
<p>okay, ich gebe mich geschlagen. aber als anfänger läuft man mit aktivierter RTTI nicht in Probleme, die ausschließlich etwas mit der RTTI zu tun haben...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364853</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364853</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Thu, 13 Sep 2007 18:36:02 GMT</pubDate></item></channel></rss>