<?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[verständnissprobleme bei Klassenvererbung und virtuellen Funktionen [Gelöst]]]></title><description><![CDATA[<p>Liebe Leser</p>
<p>Ich habe ein paar Verständnissprobleme bezüglich Funktionsüberschreibung bei einer Klassenvererbung.<br />
Dabei wird in meinem Buch beschreiben, was virtuelle Funktionen bezwecken. Dazu folgendes beispiel</p>
<pre><code>#include &lt;iostream&gt;

using namespace std;

// Oberklasse
class OBERKLASSE
{
public:

	virtual void DoSth()
	{
		cout &lt;&lt; &quot;OBERKLASSE::DoSth()&quot;;
	}

};

// Unterklasse
class UNTERKLASSE : public OBERKLASSE
{
public:
	virtual void DoSth()
	{
		cout &lt;&lt; &quot;UNTERKLASSE ::DoSth&quot;;
	}
};

int main()
{
	OBERKLASSE        ObjA;  // Oberklasseobjekt
	UNTERKLASSE       ObjB;  // Unterklasseobjekt

	OBERKLASSE        *Ptr;   // Zeiger vom Typ Oberklasse

	// Zeiger auf ObjA (Oberklasse) richten
	Ptr = &amp;ObjA;
	Ptr-&gt;DoSth(); // OBERKLASSE::DoSth() wurde aufgerufen

	// Zeiger auf ObjB (Unterklasse) richten
	Ptr = &amp;ObjB;
	Ptr-&gt;DoSth(); // UNTERKLASSE::DoSth() wurde aufgerufen

	return 0;
}
</code></pre>
<p>Man kann ja einen Zeiger vom Typ Oberklasse auf eine Objekt des Typs Unterklasse verweisen lassen.<br />
Dabei wird der Subtyp, der in Unterklasse enthalten ist beachtet, und der ander Teil von Unterklasse wird verworfe,<br />
weil dafür kein Platz ist. Im zweiten fall wird die überschriebene Funktion aufgerufen, obwohl der Zeiger<br />
vom Typ Oberklasse ist.</p>
<p>Nun zu meiner Frage. Was bewirken diese virtuellen Funktionen? Ich weis nur, das dann in jedem Objekt ein<br />
zusätzlicher Zeiger existiert, der auf eine (virtual table) verweist. (Tabelle mit Zeigern auf<br />
virtuelle Funktionen). Was haben virtuelle Funktionen mit einer Klassenvererbung zu tun? Ich habe mir<br />
die betreffenden Seiten schon so oft durchgelesen, das die Seiten schon herausfallen, was bei meinem<br />
C++ Buch leider normal ist.</p>
<p>Ich hoffe, dass mir einer helfen kann.</p>
<p>Vielen dank im voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/330080/verständnissprobleme-bei-klassenvererbung-und-virtuellen-funktionen-gelöst</link><generator>RSS for Node</generator><lastBuildDate>Fri, 03 Jul 2026 13:59:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/330080.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 21 Dec 2014 10:16:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to verständnissprobleme bei Klassenvererbung und virtuellen Funktionen [Gelöst] on Tue, 23 Dec 2014 23:06:50 GMT]]></title><description><![CDATA[<p>Liebe Leser</p>
<p>Ich habe ein paar Verständnissprobleme bezüglich Funktionsüberschreibung bei einer Klassenvererbung.<br />
Dabei wird in meinem Buch beschreiben, was virtuelle Funktionen bezwecken. Dazu folgendes beispiel</p>
<pre><code>#include &lt;iostream&gt;

using namespace std;

// Oberklasse
class OBERKLASSE
{
public:

	virtual void DoSth()
	{
		cout &lt;&lt; &quot;OBERKLASSE::DoSth()&quot;;
	}

};

// Unterklasse
class UNTERKLASSE : public OBERKLASSE
{
public:
	virtual void DoSth()
	{
		cout &lt;&lt; &quot;UNTERKLASSE ::DoSth&quot;;
	}
};

int main()
{
	OBERKLASSE        ObjA;  // Oberklasseobjekt
	UNTERKLASSE       ObjB;  // Unterklasseobjekt

	OBERKLASSE        *Ptr;   // Zeiger vom Typ Oberklasse

	// Zeiger auf ObjA (Oberklasse) richten
	Ptr = &amp;ObjA;
	Ptr-&gt;DoSth(); // OBERKLASSE::DoSth() wurde aufgerufen

	// Zeiger auf ObjB (Unterklasse) richten
	Ptr = &amp;ObjB;
	Ptr-&gt;DoSth(); // UNTERKLASSE::DoSth() wurde aufgerufen

	return 0;
}
</code></pre>
<p>Man kann ja einen Zeiger vom Typ Oberklasse auf eine Objekt des Typs Unterklasse verweisen lassen.<br />
Dabei wird der Subtyp, der in Unterklasse enthalten ist beachtet, und der ander Teil von Unterklasse wird verworfe,<br />
weil dafür kein Platz ist. Im zweiten fall wird die überschriebene Funktion aufgerufen, obwohl der Zeiger<br />
vom Typ Oberklasse ist.</p>
<p>Nun zu meiner Frage. Was bewirken diese virtuellen Funktionen? Ich weis nur, das dann in jedem Objekt ein<br />
zusätzlicher Zeiger existiert, der auf eine (virtual table) verweist. (Tabelle mit Zeigern auf<br />
virtuelle Funktionen). Was haben virtuelle Funktionen mit einer Klassenvererbung zu tun? Ich habe mir<br />
die betreffenden Seiten schon so oft durchgelesen, das die Seiten schon herausfallen, was bei meinem<br />
C++ Buch leider normal ist.</p>
<p>Ich hoffe, dass mir einer helfen kann.</p>
<p>Vielen dank im voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2433964</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2433964</guid><dc:creator><![CDATA[Sebastian Müller]]></dc:creator><pubDate>Tue, 23 Dec 2014 23:06:50 GMT</pubDate></item><item><title><![CDATA[Reply to verständnissprobleme bei Klassenvererbung und virtuellen Funktionen [Gelöst] on Sun, 21 Dec 2014 10:36:13 GMT]]></title><description><![CDATA[<p>Sebastian Müller schrieb:</p>
<blockquote>
<p>Ich habe den Code freihand gerschrieben. kann sein, das ein paar Syntaxfehler drinnen sind.</p>
</blockquote>
<p>Aha, von uns erwartest du also eine Antwort, bist aber selber zu faul, dir die fünf Minuten Zeit zu nehmen, um den Code lauffähig zu machen.</p>
<blockquote>
<p>und der ander Teil von Unterklasse wird verworfe,<br />
weil dafür kein Platz ist</p>
</blockquote>
<p>Das ist Blödsin, hier wird nichts verworfen.</p>
<blockquote>
<p>Nun zu meiner Frage. Was bewirken diese virtuellen Funktionen?</p>
</blockquote>
<p>Dass die Funktionen der abgeleiteten Klasse aufgerufen werden.</p>
<blockquote>
<p>Ich weis nur, das dann in jedem Objekt ein<br />
zusätzlicher Zeiger existiert, der auf eine (virtual table) verweist. (Tabelle mit Zeigern auf<br />
virtuelle Funktionen).</p>
</blockquote>
<p>Das ist zwar meistens so, ist aber ein Implementierungsdetail. Der Standard sagt nichts dazu.</p>
<blockquote>
<p>Was haben virtuelle Funktionen mit einer Klassenvererbung zu tun?</p>
</blockquote>
<p>Der Frage kann ich keinen Sinn entnehmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2433971</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2433971</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Sun, 21 Dec 2014 10:36:13 GMT</pubDate></item><item><title><![CDATA[Reply to verständnissprobleme bei Klassenvererbung und virtuellen Funktionen [Gelöst] on Sun, 21 Dec 2014 15:25:03 GMT]]></title><description><![CDATA[<p>Danke für deine Antwort.<br />
Kann ich das so verstehen, dass die Oberklasse weiß, dass die in ihr enthaltene Funktion überschrieben ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434036</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434036</guid><dc:creator><![CDATA[Sebastian Müller]]></dc:creator><pubDate>Sun, 21 Dec 2014 15:25:03 GMT</pubDate></item><item><title><![CDATA[Reply to verständnissprobleme bei Klassenvererbung und virtuellen Funktionen [Gelöst] on Sun, 21 Dec 2014 15:39:18 GMT]]></title><description><![CDATA[<p>Wäre es möglich, die das Wort &quot;Verständniss&quot; (und alle Abstammungen davon) wie &quot;Standart&quot; zu zensieren?<br />
Also Verständnissproblem -&gt; verständ***problem</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434040</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434040</guid><dc:creator><![CDATA[verständnisssss]]></dc:creator><pubDate>Sun, 21 Dec 2014 15:39:18 GMT</pubDate></item><item><title><![CDATA[Reply to verständnissprobleme bei Klassenvererbung und virtuellen Funktionen [Gelöst] on Sun, 21 Dec 2014 15:49:38 GMT]]></title><description><![CDATA[<p>Sebastian Müller schrieb:</p>
<blockquote>
<p>Kann ich das so verstehen, dass die Oberklasse weiß, dass die in ihr enthaltene Funktion überschrieben ist?</p>
</blockquote>
<p>Zur Laufzeit existieren keine Klassen. In jeder Objekinstanz ist für virtuelle Funktionen (oft über die erwähnte vtable) festgelegt, welche konkrete Funktion zu nutzen ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434041</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434041</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Sun, 21 Dec 2014 15:49:38 GMT</pubDate></item><item><title><![CDATA[Reply to verständnissprobleme bei Klassenvererbung und virtuellen Funktionen [Gelöst] on Sun, 21 Dec 2014 21:49:03 GMT]]></title><description><![CDATA[<p>Sorry. Ich habe mich falsch ausgedrückt. Eigendlich meine ich ja Objekte.<br />
Klassen definieren ja nur die Eigenschaften eines Objektes. Man kann sie als<br />
Bauanleitung verstehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434066</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434066</guid><dc:creator><![CDATA[Sebastian Müller]]></dc:creator><pubDate>Sun, 21 Dec 2014 21:49:03 GMT</pubDate></item><item><title><![CDATA[Reply to verständnissprobleme bei Klassenvererbung und virtuellen Funktionen [Gelöst] on Sun, 21 Dec 2014 18:48:25 GMT]]></title><description><![CDATA[<p>verständnisssss schrieb:</p>
<blockquote>
<p>Wäre es möglich, die das Wort &quot;Verständniss&quot; (und alle Abstammungen davon) wie &quot;Standart&quot; zu zensieren?<br />
Also Verständnissproblem -&gt; verständ***problem</p>
</blockquote>
<p>Möglich ja, aber störend negativ ist es mir noch nicht aufgefallen. Jetzt, wo du mich drauf aufmerksam gemacht hast, werde ich mal verstärkt drauf achten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434080</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434080</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 21 Dec 2014 18:48:25 GMT</pubDate></item><item><title><![CDATA[Reply to verständnissprobleme bei Klassenvererbung und virtuellen Funktionen [Gelöst] on Mon, 22 Dec 2014 14:52:10 GMT]]></title><description><![CDATA[<p>Also ich denke, dass ich es jetzt verstanden habe.</p>
<p>Ich habe mir folgenden Artikel mehrfach durchgelesen.<br />
<a href="http://www.willemer.de/informatik/cpp/cppvirt.htm" rel="nofollow">http://www.willemer.de/informatik/cpp/cppvirt.htm</a></p>
<p>Hier eine kleine Zusammenfassung.<br />
Der Einsatz von virtuellen Funktionen bezwecken, dass das Objekt die Verantwortung übernimmt, die richtige Funktion aufzurufen.<br />
Dabei kennt das Objekt die Klassenzugehörigkeit durch einen Zeiger auf die vtbl und ruft die Funtion über diese Tabelle (Array) auf.<br />
Wenn eine Klasse abgeleitet wird, erhält die neue Klasse eine Kopie der vtbl von der Oberklasse.<br />
Für alle überschriebenen Funktionen wird der Zeiger auf die eigenen Funktionen gesetzt.<br />
Deshalb wird auch die überschriebene Funktion nachher aufgerufen.</p>
<p>Im obigen beispiel mit OBERKLASS und UNTERKLASSE hat das Objekt, auf das Ptr zeigt<br />
die korekten überladenen funktionen in der vtbl, obwohl der zeiger ja nur auf den<br />
Subtyp verweist. Das Objekt ruft über die Tabelle die richtige Funktion auf.</p>
<p>Wenn es etwas zu korigieren gibt, wäre es sehr nett, mich darüber zu informieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434195</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434195</guid><dc:creator><![CDATA[Sebastian Müller]]></dc:creator><pubDate>Mon, 22 Dec 2014 14:52:10 GMT</pubDate></item></channel></rss>