<?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[Pointer &amp;amp; Klassen]]></title><description><![CDATA[<p>Hi! Folgende 2 Klassen habe ich:</p>
<pre><code>#include&lt;iostream&gt;
using namespace std;

class Vector
{
private:
	int x,y,z;
public:
	Vector(int a,int b,int c)
	{
		x=a;
		y=b;
		z=c;
	}
	Vector&amp; operator+=(const Vector&amp; v)
	{
		x+=v.x;
		y+=v.y;
		z+=v.z;
		return *this;
	}
	friend ostream&amp; operator&lt;&lt;(ostream &amp;os,const Vector&amp; v)
	{
		os&lt;&lt;v.x&lt;&lt;&quot; &quot;&lt;&lt;v.y&lt;&lt;&quot; &quot;&lt;&lt;v.z;
		return os;
	}
	virtual void test()
	{
		cout&lt;&lt;&quot;Basisklasse!&quot;&lt;&lt;endl;
	}
};

class Abg:public Vector
{
public:
	Abg(int a,int b,int c):Vector(a,b,c) {}
	void test()
	{
		cout&lt;&lt;&quot;Abgeleitete Klasse!&quot;&lt;&lt;endl;
	}
};

int main()
{
    Vector *vptr=&amp;Vector(10,20,30);
    Abg *aptr=&amp;Abg(1,2,3);
    vptr=aptr;
    vptr-&gt;test();
    return 0;
}
</code></pre>
<p>Wie kann ich aptr auf die Basisklasse Vector zeigen lassen?</p>
<p>Meine 2.Frage:</p>
<p>Gelegentlich findet man solche Anweisungen</p>
<pre><code>if(i&gt;2580000L)
</code></pre>
<p>Was genau besagt das L hinter der Konstanten?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/129779/pointer-amp-klassen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 10:19:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/129779.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 16 Dec 2005 15:39:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Pointer &amp;amp; Klassen on Fri, 16 Dec 2005 15:39:00 GMT]]></title><description><![CDATA[<p>Hi! Folgende 2 Klassen habe ich:</p>
<pre><code>#include&lt;iostream&gt;
using namespace std;

class Vector
{
private:
	int x,y,z;
public:
	Vector(int a,int b,int c)
	{
		x=a;
		y=b;
		z=c;
	}
	Vector&amp; operator+=(const Vector&amp; v)
	{
		x+=v.x;
		y+=v.y;
		z+=v.z;
		return *this;
	}
	friend ostream&amp; operator&lt;&lt;(ostream &amp;os,const Vector&amp; v)
	{
		os&lt;&lt;v.x&lt;&lt;&quot; &quot;&lt;&lt;v.y&lt;&lt;&quot; &quot;&lt;&lt;v.z;
		return os;
	}
	virtual void test()
	{
		cout&lt;&lt;&quot;Basisklasse!&quot;&lt;&lt;endl;
	}
};

class Abg:public Vector
{
public:
	Abg(int a,int b,int c):Vector(a,b,c) {}
	void test()
	{
		cout&lt;&lt;&quot;Abgeleitete Klasse!&quot;&lt;&lt;endl;
	}
};

int main()
{
    Vector *vptr=&amp;Vector(10,20,30);
    Abg *aptr=&amp;Abg(1,2,3);
    vptr=aptr;
    vptr-&gt;test();
    return 0;
}
</code></pre>
<p>Wie kann ich aptr auf die Basisklasse Vector zeigen lassen?</p>
<p>Meine 2.Frage:</p>
<p>Gelegentlich findet man solche Anweisungen</p>
<pre><code>if(i&gt;2580000L)
</code></pre>
<p>Was genau besagt das L hinter der Konstanten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/943636</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/943636</guid><dc:creator><![CDATA[AJ_Styles]]></dc:creator><pubDate>Fri, 16 Dec 2005 15:39:00 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer &amp;amp; Klassen on Fri, 16 Dec 2005 15:43:51 GMT]]></title><description><![CDATA[<p>1. nein<br />
2. L schreibt man dahinter, um eindeutig dem Compiler zu sagen, dass des ein long ist</p>
]]></description><link>https://www.c-plusplus.net/forum/post/943641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/943641</guid><dc:creator><![CDATA[bluecode]]></dc:creator><pubDate>Fri, 16 Dec 2005 15:43:51 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer &amp;amp; Klassen on Fri, 16 Dec 2005 16:41:48 GMT]]></title><description><![CDATA[<p>AJ_Styles schrieb:</p>
<blockquote>
<p>Wie kann ich aptr auf die Basisklasse Vector zeigen lassen?</p>
</blockquote>
<p>gar nicht aber du kannst vptr auf ein Abg zeigen lassen was auch viel sinnvoller ist</p>
<pre><code class="language-cpp">vptr=new Abg(1,2,3);
 vptr-&gt;test();
 delete vptr;
</code></pre>
<p>K</p>
]]></description><link>https://www.c-plusplus.net/forum/post/943695</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/943695</guid><dc:creator><![CDATA[ZuK]]></dc:creator><pubDate>Fri, 16 Dec 2005 16:41:48 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer &amp;amp; Klassen on Fri, 16 Dec 2005 17:09:20 GMT]]></title><description><![CDATA[<p>AJ_Styles schrieb:</p>
<blockquote>
<p>Wie kann ich aptr auf die Basisklasse Vector zeigen lassen?</p>
</blockquote>
<p>bluecode schrieb:</p>
<blockquote>
<p>1. nein</p>
</blockquote>
<p>Passend bedeutet wohl irgendwas anderes. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Aber um auf die erste Frage zurückzukommen, sollten wir erstmal deine Fehler ansprechen.</p>
<pre><code class="language-cpp">Vector *vptr=&amp;Vector(10,20,30);
    Abg *aptr=&amp;Abg(1,2,3);
</code></pre>
<p>Das ist gar nicht gut. Evtl. solltest du dir mal die Warnungen deines Compilers genauer anschaun. Der GCC sagt hier zB folgendes</p>
<pre><code>warning: taking address of temporary
</code></pre>
<p>Und genau das sind <em>Vector(10,20,30)</em> und <em>Abg(1,2,3)</em>, temporäre Objekte. Dh sie werden erzeugt und sofort wieder zerstört, nachdem sie als rvalue nicht mehr benötigt werden. Deine Zeiger existieren aber weiter, nur verweisen sie auf totes Fleisch. Sie sind so nicht benutzbar.<br />
Entweder du erzeugst deine Objekte dynamisch oder du erzeugst die Objekte mit automatischem Speicher, was ich immer vorziehen würde sofern es keine guten Gründe dagegen gibt.</p>
<pre><code class="language-cpp">Vector v(10,20,30);
Abg a(1,2,3);
</code></pre>
<p>Jetzt haben wir schon mal zwei Objekte die solange verfügabr sind, bis der Gültigkeitsbereich verlassen wird. Du kannst jederzeit Zeiger darauf erzeugen.</p>
<pre><code class="language-cpp">Vector* vptr = &amp;v;
Abg* aptr = &amp;a;
</code></pre>
<p>Bedenke aber, es sind immer noch zwei verschiedene Objekte. Die Zeiger verweisen somit auch auf unterschiedliche Objekte.<br />
Willst du nun einen Verweis auf die Basisklasse, dann ist das ziemlich trivial. Der Compiler kann sowas nämlich implizit durchführen, sofern public Vererbung vorliegt. Da es in C++ aber solch schöne Sachen wie Referenzen gibt, verwenden wir diese und keine Zeiger.</p>
<pre><code class="language-cpp">Vector&amp; a_base = a;
</code></pre>
<p>Über <em>a_base</em> kannst du jetzt auf das Bisisklassenobjekt von <em>a</em> zugreifen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/943703</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/943703</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Fri, 16 Dec 2005 17:09:20 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer &amp;amp; Klassen on Fri, 16 Dec 2005 21:31:01 GMT]]></title><description><![CDATA[<p>Danke erstmal!</p>
<p>Hab noch ein paar Probleme:</p>
<blockquote>
<p>Evtl. solltest du dir mal die Warnungen deines Compilers genauer anschaun</p>
</blockquote>
<p>Visual C++ 6 gibt keine Warnung dafür aus.</p>
<pre><code class="language-cpp">Vector *vptr=&amp;Vector(10,20,30);
    Abg *aptr=&amp;Abg(1,2,3);
</code></pre>
<p>Warum handelt es sich denn hierbei um temporäre Objekte und nicht um ganz normale lokale Objekte?</p>
<pre><code>Willst du nun einen Verweis auf die Basisklasse, dann ist das ziemlich trivial. Der Compiler kann sowas nämlich implizit durchführen, sofern public Vererbung vorliegt
</code></pre>
<p>Meinst du ich kann einfach aptr=vptr schreiben?<br />
Dann bekomme ich aber folgende Fehlermeldung:</p>
<p>error C2440: '=' : 'class Vector *' kann nicht in 'class Abg *' konvertiert werden</p>
<blockquote>
<p>Über a_base kannst du jetzt auf das Bisisklassenobjekt von a zugreifen.</p>
</blockquote>
<p>Hab das jetzt so gemacht:</p>
<pre><code>#include&lt;iostream&gt;
using namespace std;

class Vector
{
private:
	int x,y,z;
public:
	Vector(int a,int b,int c)
	{
		x=a;
		y=b;
		z=c;
	}
	Vector&amp; operator+=(const Vector&amp; v)
	{
		x+=v.x;
		y+=v.y;
		z+=v.z;
		return *this;
	}
	friend ostream&amp; operator&lt;&lt;(ostream &amp;os,const Vector&amp; v)
	{
		os&lt;&lt;v.x&lt;&lt;&quot; &quot;&lt;&lt;v.y&lt;&lt;&quot; &quot;&lt;&lt;v.z;
		return os;
	}
	virtual void test()
	{
		cout&lt;&lt;&quot;Basisklasse!&quot;&lt;&lt;endl;
	}
};

class Abg:public Vector
{
public:
	Abg(int a,int b,int c):Vector(a,b,c) {}
	void test()
	{
		cout&lt;&lt;&quot;Abgeleitete Klasse!&quot;&lt;&lt;endl;
	}
};

Vector v(10,20,30);
Abg a(1,2,3);

int main()
{
	Vector* vptr = &amp;v;
	Abg* aptr = &amp;a;
	aptr=vptr;
	Vector&amp; a_base=a;
	a_base.test();
	return 0;
}
</code></pre>
<p>Allerdings wird, wenn ich die Methode test() aufrufe, trotzdem die Methode der abgeleiteten Klasse aufgerugen, trotz virtual-Deklaration.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/943885</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/943885</guid><dc:creator><![CDATA[AJ_Styles]]></dc:creator><pubDate>Fri, 16 Dec 2005 21:31:01 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer &amp;amp; Klassen on Fri, 16 Dec 2005 21:58:08 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">Vector v(10,20,30);
Abg a(1,2,3);

int main()
{
    Vector* vptr = &amp;v;
    Abg* aptr = &amp;a;
    //aptr=vptr;    // nicht erlaubt
    vptr=aptr;      // ok
    Vector&amp; a_base=a;
    a_base.test();  // Abg.test() wird aufgerufen
    vptr-&gt;test();   // Abg.test() wird aufgerufen
    return 0;
}
</code></pre>
<p>EDIT</p>
<blockquote>
<p>Allerdings wird, wenn ich die Methode test() aufrufe, trotzdem die Methode der abgeleiteten Klasse aufgerugen, trotz virtual-Deklaration.</p>
</blockquote>
<p>Jetzt verstehe ich erst was du willst. In diese Richtung geht's nicht so einfach.<br />
So gehts ( habe aber noch nie gesehen dass das jemand absichtlich macht )</p>
<pre><code class="language-cpp">Vector vv= a; // slicing
    vv.test();   // Vector.test() wird aufgerufen
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/943893</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/943893</guid><dc:creator><![CDATA[ZuK]]></dc:creator><pubDate>Fri, 16 Dec 2005 21:58:08 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer &amp;amp; Klassen on Fri, 16 Dec 2005 21:57:09 GMT]]></title><description><![CDATA[<blockquote>
<p>//aptr=vptr; // nicht erlaubt</p>
</blockquote>
<p>Hmm..</p>
<p>Warum steht dann in der Literatur:</p>
<p>&quot;Ein Zeiger (oder eine Referenz), der auf ein Objekt einer abgeleiteten Klasse weist, kann in einen Zeiger auf ein Objekt der Basisklasse umgewandelt werden. Dies entspricht der Standardkonvertierung, die auch ohne explizite Typumwandlung erlaubt ist.&quot;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/943899</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/943899</guid><dc:creator><![CDATA[AJ_Styles]]></dc:creator><pubDate>Fri, 16 Dec 2005 21:57:09 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer &amp;amp; Klassen on Fri, 16 Dec 2005 22:03:18 GMT]]></title><description><![CDATA[<p>Da hast du recht aber nicht umgekehrt ( wie in dem Fall ).<br />
Kannst dir ungefähr so vorstellen<br />
ein schlafzimmer ist ein zimmer. aber ein zimmer muss nicht unbedingt ein schlafzimmer sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/943900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/943900</guid><dc:creator><![CDATA[ZuK]]></dc:creator><pubDate>Fri, 16 Dec 2005 22:03:18 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer &amp;amp; Klassen on Fri, 16 Dec 2005 22:42:05 GMT]]></title><description><![CDATA[<p>AJ_Styles schrieb:</p>
<blockquote>
<p>Visual C++ 6 gibt keine Warnung dafür aus.</p>
</blockquote>
<p>Visual C++ 6 ist ja auch kein Compiler. Und dass der darin enthaltene Compiler (MSC) nicht mehr ganz taufrisch ist, da gabs auch schon genügend Beiträge zu. Vielleicht hilft auch, wenn das Warnlevel einfach ganz rauf gesetzt wird.</p>
<p>AJ_Styles schrieb:</p>
<blockquote>
<pre><code class="language-cpp">Vector *vptr=&amp;Vector(10,20,30);
    Abg *aptr=&amp;Abg(1,2,3);
</code></pre>
<p>Warum handelt es sich denn hierbei um temporäre Objekte und nicht um ganz normale lokale Objekte?</p>
</blockquote>
<p>Um lokale Objekte handelt es sich trotzdem, nur die Lebensdauer ist eine andere als &quot;normal&quot; erzeugte Variablen/Objekte. Die Lebensdauer endet dann, wenn die Anweisung vollständig abgearbeitet ist. Und wie ich bereits sagte, bedeutet dies praktisch, dass das temporäre Objekt zerstört werden kann, wenn es als rvalue nicht mehr gebraucht wird.</p>
<p>AJ_Styles schrieb:</p>
<blockquote>
<p>Meinst du ich kann einfach aptr=vptr schreiben?<br />
Dann bekomme ich aber folgende Fehlermeldung:</p>
<p>error C2440: '=' : 'class Vector *' kann nicht in 'class Abg *' konvertiert werden</p>
</blockquote>
<p>Nein. Implizit funktioniert das nur in eine Richtung, nämlich von unten nach oben, dh von abgeleiteter Klasse zur Basisklasse. Für die andere Richtung musst du schon mehr machen. Dann brauchst du einen Cast.</p>
<pre><code class="language-cpp">aptr = static_cast&lt;Abg*&gt;(vptr);
</code></pre>
<p>Das solltest du aber nur machen, wenn du dir wirklich sicher bist, dass du einen Basisklassenzeiger auf das abgeleitete Objekt (<em>Abg</em>) hast. Ansonsten schaust du dir mal dynamic_cast an. Oder noch besser, du überlegst dir erstmal, ob du diesen Downcast überhaupst brauchst oder nicht doch eine elegantere Lösung findest.</p>
<p>AJ_Styles schrieb:</p>
<blockquote>
<p>Hab das jetzt so gemacht:<br />
[...]</p>
</blockquote>
<p>Der Code ist bis auf das angesprochene aptr=vptr ok. Globale Variablen wollen wir aber nur im äussersten Notfall. Und solch einer liegt hier nicht vor. Also definieren wir v und a in der main Funktion.</p>
<p>AJ_Styles schrieb:</p>
<blockquote>
<p>Allerdings wird, wenn ich die Methode test() aufrufe, trotzdem die Methode der abgeleiteten Klasse aufgerugen, trotz virtual-Deklaration.</p>
</blockquote>
<p>Was völlig normal ist, virtual verdeckt nicht sondern überschreibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/943940</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/943940</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Fri, 16 Dec 2005 22:42:05 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer &amp;amp; Klassen on Sat, 17 Dec 2005 13:07:06 GMT]]></title><description><![CDATA[<p>Danke nochmal.</p>
<p>Ich habe noch Probleme mit einigen Formulierungen:</p>
<p>Um noch mal auf meine Literaturquelle zurückzukommen:</p>
<p>&quot;Ein Zeiger (oder eine Referenz), der auf ein Objekt einer abgeleiteten Klasse weist, kann in einen Zeiger auf ein Objekt der Basisklasse umgewandelt werden. Dies entspricht der Standardkonvertierung, die auch ohne explizite Typumwandlung erlaubt ist.&quot;</p>
<p>Aber genau das funktioniert ja nicht. <strong>aptr</strong>, der Zeiger auf die <strong>abgeleitete Klasse</strong> kann nicht in <strong>vptr</strong>, einen Zeiger auf die <strong>Basisklasse</strong> umgewandelt werden?!</p>
<blockquote>
<p>Das solltest du aber nur machen, wenn du dir wirklich sicher bist, dass du einen Basisklassenzeiger auf das abgeleitete Objekt (Abg) hast. Ansonsten schaust du dir mal dynamic_cast an. Oder noch besser, du überlegst dir erstmal, ob du diesen <strong>Downcast</strong> überhaupst brauchst oder nicht doch eine elegantere Lösung findest.</p>
</blockquote>
<p>Wieso spricht man in diesem Zusammenhang von einem Downcast? Upcast wäre doch logischer, da man einen Zeiger einer abgeleitete Klasse auf eine Basisklasse zeigen lässt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/944267</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/944267</guid><dc:creator><![CDATA[AJ_Styles]]></dc:creator><pubDate>Sat, 17 Dec 2005 13:07:06 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer &amp;amp; Klassen on Sat, 17 Dec 2005 13:22:49 GMT]]></title><description><![CDATA[<p>AJ_Styles schrieb:</p>
<blockquote>
<p>&quot;Ein Zeiger (oder eine Referenz), der auf ein Objekt einer abgeleiteten Klasse weist, kann in einen Zeiger auf ein Objekt der Basisklasse umgewandelt werden. Dies entspricht der Standardkonvertierung, die auch ohne explizite Typumwandlung erlaubt ist.&quot;</p>
<p>Aber genau das funktioniert ja nicht. <strong>aptr</strong>, der Zeiger auf die <strong>abgeleitete Klasse</strong> kann nicht in <strong>vptr</strong>, einen Zeiger auf die <strong>Basisklasse</strong> umgewandelt werden?!</p>
</blockquote>
<p>Du wandelst nicht aptr in vptr um sondern</p>
<pre><code class="language-cpp">aptr=vptr; // nicht erlaubt
</code></pre>
<p>wandelt vptr in aptr um. ( aus vptr soll ein aptr werden ) <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/944276</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/944276</guid><dc:creator><![CDATA[ZuK]]></dc:creator><pubDate>Sat, 17 Dec 2005 13:22:49 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer &amp;amp; Klassen on Sat, 17 Dec 2005 17:40:03 GMT]]></title><description><![CDATA[<p>AJ_Styles schrieb:</p>
<blockquote>
<p>&quot;Ein Zeiger (oder eine Referenz), der auf ein Objekt einer abgeleiteten Klasse weist, kann in einen Zeiger auf ein Objekt der Basisklasse umgewandelt werden. Dies entspricht der Standardkonvertierung, die auch ohne explizite Typumwandlung erlaubt ist.&quot;</p>
<p>Aber genau das funktioniert ja nicht. <strong>aptr</strong>, der Zeiger auf die <strong>abgeleitete Klasse</strong> kann nicht in <strong>vptr</strong>, einen Zeiger auf die <strong>Basisklasse</strong> umgewandelt werden?!</p>
<blockquote>
<p>Das solltest du aber nur machen, wenn du dir wirklich sicher bist, dass du einen Basisklassenzeiger auf das abgeleitete Objekt (Abg) hast. Ansonsten schaust du dir mal dynamic_cast an. Oder noch besser, du überlegst dir erstmal, ob du diesen <strong>Downcast</strong> überhaupst brauchst oder nicht doch eine elegantere Lösung findest.</p>
</blockquote>
<p>Wieso spricht man in diesem Zusammenhang von einem Downcast? Upcast wäre doch logischer, da man einen Zeiger einer abgeleitete Klasse auf eine Basisklasse zeigen lässt.</p>
</blockquote>
<p>Ich glaube, du hast noch einige Probleme mit dem Verständnis, was zu was umgewandelt wird.</p>
<pre><code class="language-cpp">a = b;
 &lt;--
</code></pre>
<p>Links steht das Ziel, muss ein sogenannter lvalue sein. Und rechts steht die Quelle, also der rvalue. (wobei b trotzdem auch ein lvalue sein kann)<br />
Sollte also b nicht direkt a zugewiesen werden können, muss eine Umwandlung von Typ(b) nach Typ(a) erfolgen.</p>
<p>Wenn da also steht</p>
<pre><code class="language-cpp">vptr = aptr;
</code></pre>
<p>dann wird aptr zu vptr umgewandelt, also der Zeiger der abgeleiteten Klasse in einen Zeiger der der Basisklasse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/944424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/944424</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Sat, 17 Dec 2005 17:40:03 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer &amp;amp; Klassen on Sun, 18 Dec 2005 15:57:08 GMT]]></title><description><![CDATA[<p>Sorry das ich euch nochmal nerve:</p>
<blockquote>
<p>Wenn da also steht</p>
<p>vptr = aptr;</p>
<p>dann wird aptr zu vptr umgewandelt, also der Zeiger der abgeleiteten Klasse in einen Zeiger der Basisklasse.</p>
</blockquote>
<p>Aber wieso kann ich, nach obiger Typumwandlung, aptr trotzdem nicht auf eine Instanz der Basisklasse zeigen lassen, wo aptr doch nun ein Basisklassenzeiger sein sollte?</p>
<blockquote>
<p>aptr=&amp;v //Fehler</p>
</blockquote>
<p>Und wieso wird, wenn ich jetzt über vptr die Methode test() aufrufe, die Methode der abgeleiteten Klasse aufgerufen? Ich denke, ich habe aptr in vptr umgewandelt und nicht umgekehrt (was ja auch ohne expliziten cast nicht gehen würde)? <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="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/944903</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/944903</guid><dc:creator><![CDATA[AJ_Styles]]></dc:creator><pubDate>Sun, 18 Dec 2005 15:57:08 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer &amp;amp; Klassen on Sun, 18 Dec 2005 16:46:49 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich denke, ich habe aptr in vptr umgewandelt</p>
</blockquote>
<p>Du hast überhaupt nichts umgewandelt ( im sinne von Verändert ).<br />
Ein Zeiger vom typ der Basisklasse zeigt jetzt auf ein Object der abgeleiteten Klasse. Umgekehrt ist das nicht möglich ein Zeiger vom Typ einer Abgeleiteten Klasse kann ( ohne expliziten cast ) nicht auf ein Object vom typ der Basisklasse zeigen. Das kann ja auch nicht sein da der Basisklasse ja Attibute der abgeleiteten Klasse fehlen könnten, eine abgeleitete Klasse erbt aber immer alle Attribute der Basisklasse also ist auch kein cast notwendig.</p>
<blockquote>
<p>Und wieso wird, wenn ich jetzt über vptr die Methode test() aufrufe, die Methode der abgeleiteten Klasse aufgerufen?</p>
</blockquote>
<p>Der einzige Sinn von Polymorphie ist es ja, dass über einem Zeiger vom typ der Basisklasse eben auf die virtuellen Methoden der konkreten (abgeleiteten) Klasse zugegriffen wird (late binding).<br />
Kurt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/944951</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/944951</guid><dc:creator><![CDATA[ZuK]]></dc:creator><pubDate>Sun, 18 Dec 2005 16:46:49 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer &amp;amp; Klassen on Sun, 18 Dec 2005 17:37:42 GMT]]></title><description><![CDATA[<p>AJ_Styles schrieb:</p>
<blockquote>
<p>Aber wieso kann ich, nach obiger Typumwandlung, aptr trotzdem nicht auf eine Instanz der Basisklasse zeigen lassen, wo aptr doch nun ein Basisklassenzeiger sein sollte?</p>
</blockquote>
<p>Nein, aptr ist kein Basisklassenzeiger. Ich erinnere dich nochmal an die Deklaration</p>
<pre><code class="language-cpp">Abg* aptr
</code></pre>
<p>AJ_Styles schrieb:</p>
<blockquote>
<p>Und wieso wird, wenn ich jetzt über vptr die Methode test() aufrufe, die Methode der abgeleiteten Klasse aufgerufen?</p>
</blockquote>
<p>Das hab ich dir doch schon beantwortet.</p>
<blockquote>
<p>virtual verdeckt nicht sondern überschreibt</p>
</blockquote>
<p>Die Funktion ist nunmal virtuell. Wenn du also willst, dass die Funktion der Basisklasse aufgerufen wird, dann musst du auch ein Objekt der Basisklasse instanzieren.</p>
<p>Vielleicht solltest du dir das ganze mal etwas bildlich vorstellen.</p>
<pre><code>----------------------------------------
|              Abg Objekt              |
|--------------------------------------|
| Vector     | vtable     | Abg only   |
|------------|------------|------------|
| x          | test()     | ctor       |
| y          |            | ...        |
| z          |            |            |
| ctor       |            |            |
| ...        |            |            |
----------------------------------------
</code></pre>
<p>Du instanzierst also ein Objekt des Typs <em>Abg</em>. Dieses kannst du dir bildlich wie mein ASCII-Art <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="🙂"
    /> vorstellen. Da wäre der Teil der Basisklasse (Vector), die vtable und der Teil der in Abg noch hinzugekommen ist (Abg only). In der vtable werden die Adressen der virtuellen Funktionen abgespeichert. Hat deine Klasse keine virtuellen Funktionen, so kann der Teil auch wegfallen. Bei der Instanzierung wird dort also die Adresse von Abg::test abgelegt.<br />
Wenn du jetzt einen Zeiger auf dieses Objekt hast (Abg*) und wandelst diesen in einen Zeiger der Basisklasse um (Vector*), dann zeigt dieser auf den Vector Teil. Rufst du jetzt test() auf, sieht der Compiler, dass es eine virtuelle Funktion ist (so hast du diese ja schliesslich in Vector deklariert) und schaut dementsprechend in die vtable. Dort steht immer noch Abg::test und diese Funktion ruft er dann auch auf.<br />
Und genau darin liegt ja auch der Witz von virtual, du hast also eine Referenz oder einen Zeiger auf die Basisklasse, es wird aber trotzdem die Funktion des eigentlich instanzierten Objektes, nämlich der abgeleiteten Klasse, aufgerufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/944982</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/944982</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Sun, 18 Dec 2005 17:37:42 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer &amp;amp; Klassen on Sun, 18 Dec 2005 18:18:59 GMT]]></title><description><![CDATA[<p>Danke nochmal euch beiden! Ihr seid eine wirklich große Hilfe!</p>
<p>Also eine Zusammenfassung:</p>
<p>Wenn ich schreibe</p>
<pre><code>aptr=vptr
</code></pre>
<p>;</p>
<p>Ich möchte, dass mein Zeiger aptr (der auf eine abgeleitete Klasse zeigt) auf das Objekt zeigt, dessen Adresse in vptr gespeichert ist (in diesem Fall also eine Instanz der Basisklasse Vektor).Da beide Typen nicht kompatibel sind, muss vptr zuvor per static_cast in ein Zeiger auf die abgeleitete Klasse umgewandelt werden. Der Cast ist notwendig, da sich in der abgeleiteten Klasse ja andere (zusätzliche) Elemente als in der Basisklasse befinden können.<br />
Umgekehrt ist kein cast nötig, da der Compiler dies implizit durchführen kann (sofern public-Vererbung vorliegt).</p>
<p>Kann man das so stehen lassen?</p>
<p>Das mit der virtuellen Tabelle und der späten Bindung wurde auch sehr gut erklärt.</p>
<p>Eine Sache wundert mich dennoch:</p>
<blockquote>
<p>Wenn du jetzt einen Zeiger auf dieses Objekt hast (Abg*) und wandelst diesen in einen Zeiger der Basisklasse um (Vector*), dann zeigt dieser auf den Vector Teil.</p>
</blockquote>
<p>Das heisst eigentlich zeigt der Pointer gar nicht auf eine Instanz der Basisklasse, sondern vielmehr auf den Vector-Teil im abgeleiteten Objekt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/945025</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/945025</guid><dc:creator><![CDATA[AJ_Styles]]></dc:creator><pubDate>Sun, 18 Dec 2005 18:18:59 GMT</pubDate></item></channel></rss>