<?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-To-Pointer]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>warum lässt sich folgender Code nicht übersetzen ?????</p>
<p>class A {};<br />
class B: public A {};</p>
<p>int main(void)<br />
{<br />
B* pB = new B;<br />
A* pA = pB; // OK<br />
A** ppA = &amp;pB; &lt;- Hier ist das Problem ?<br />
}</p>
<p>Ich bekomme folende Fehler:<br />
MSVC 8.0: error C2440: 'initializing' : cannot convert from 'B **__w64 ' to 'A **'<br />
gcc 3.3.3: cannot convert `B**' to `A**' in initialization</p>
<p>Grüße,<br />
Philipp</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/193654/pointer-to-pointer</link><generator>RSS for Node</generator><lastBuildDate>Mon, 28 Sep 2026 03:39:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/193654.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 28 Sep 2007 10:41:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Pointer-To-Pointer on Fri, 28 Sep 2007 10:41:40 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>warum lässt sich folgender Code nicht übersetzen ?????</p>
<p>class A {};<br />
class B: public A {};</p>
<p>int main(void)<br />
{<br />
B* pB = new B;<br />
A* pA = pB; // OK<br />
A** ppA = &amp;pB; &lt;- Hier ist das Problem ?<br />
}</p>
<p>Ich bekomme folende Fehler:<br />
MSVC 8.0: error C2440: 'initializing' : cannot convert from 'B **__w64 ' to 'A **'<br />
gcc 3.3.3: cannot convert `B**' to `A**' in initialization</p>
<p>Grüße,<br />
Philipp</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374304</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374304</guid><dc:creator><![CDATA[PhilippMaurer]]></dc:creator><pubDate>Fri, 28 Sep 2007 10:41:40 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-To-Pointer on Fri, 28 Sep 2007 10:45:12 GMT]]></title><description><![CDATA[<p>Du kannst zwar einen &quot;Zeiger auf abgeleitete Klasse&quot; in einen &quot;Zeiger auf Basisklasse&quot; umwandeln, aber das geht nur in einer Ebene. Alles andere würde nur zu Problemen mit der Polymorphie, Objektgrößen etc führen.</p>
<p>(btw, &quot;A** ppA = &amp;pA;&quot; ist übrigens erlaubt, falls du es unbedingt brauchst)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374307</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374307</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 28 Sep 2007 10:45:12 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-To-Pointer on Fri, 28 Sep 2007 11:03:32 GMT]]></title><description><![CDATA[<p>ja das es nicht geht weiß ich, die Frage ist, WARUM genau.</p>
<p>Weshalb spielt die Polymorphie eine Rolle ?</p>
<p>und warum die Objektgröße ? Wie Du schreibst, in einer Ebene geht es (da ist die Objektgröße ja kein Problem) und dann kommt ja nur der Pointer hinzu und Pointer sind immer gleich groß, egal wo sie hinzeigen....</p>
<p>Kannst Du das mal eventuell in einem konstruierten Beispiel zeigen, wo es Probelme mit der Polymorphie / Objekgröße geben würde (wenn der obige Code funktionieren würde) ? Danke !!</p>
<p>Und was genau verbirgt sich hinter Deinem &quot;etc&quot; ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374320</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374320</guid><dc:creator><![CDATA[PhilippMaurer]]></dc:creator><pubDate>Fri, 28 Sep 2007 11:03:32 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-To-Pointer on Fri, 28 Sep 2007 11:20:04 GMT]]></title><description><![CDATA[<p>darum:</p>
<pre><code class="language-cpp">class base
{
public:
  // ...
};

class a : public base
{
public:
  // ...
};

class b : public base
{
public:
  // ...
};

// ...

base* ptr = new a;
b* ptr_2_b = ptr; // wäre falsch und ist daher nicht möglich
</code></pre>
<p>ein zeiger auf eine basisklasse kann auch auf eine abgeleitete klasse zeigen. aber nicht umgekehrt. denn es gibt meistens mehrere abgeleitete klassen. woher soll der compiler dann wissen auf welchen typ der zeiger wirklich zeigt.</p>
<p>schau dir mal dynamic_cast an <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/1374328</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374328</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Fri, 28 Sep 2007 11:20:04 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-To-Pointer on Fri, 28 Sep 2007 11:18:57 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<pre><code class="language-cpp">base* ptr = new a;
b* ptr_2_b = ptr;
</code></pre>
</blockquote>
<p>was hat das mit der frage zu tun?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374331</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374331</guid><dc:creator><![CDATA[cpt. bluebear]]></dc:creator><pubDate>Fri, 28 Sep 2007 11:18:57 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-To-Pointer on Fri, 28 Sep 2007 11:26:03 GMT]]></title><description><![CDATA[<p>Hey dot,</p>
<p>ok, alles klar.....wo ist der Zusammenhang mit dem oben genannten Problem ?? Ich habe nur Pointer vom Typ der Basisklasse...</p>
<p>Die Frage war, WARUM geht es nicht. Das es nicht geht ist klar und wie ich es (für mein Problem hier) umgehen kann, auch.</p>
<p>Aber mir ist nicht klar, warum der Compiler das nicht automatisch erkennt.<br />
Weil:</p>
<p>B* pB = new B;<br />
A* pA = pB;</p>
<p>A** ppA1 = &amp;pA; &lt;- geht, ist ein pointer auf einen A pointer, der auf ein B zeigt<br />
A** ppA2 = &amp;pB; &lt;- geht nicht, soll ein pointer sein, der auf einen B pointer zeigt, der auf ein B zeigt.</p>
<p>Dabei kann aber ein b pointer auf ein B einem A pointer zugewiesen werden....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374332</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374332</guid><dc:creator><![CDATA[PhilippMaurer]]></dc:creator><pubDate>Fri, 28 Sep 2007 11:26:03 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-To-Pointer on Fri, 28 Sep 2007 11:27:13 GMT]]></title><description><![CDATA[<p>ich versteh nicht ganz wo das problem liegt. der compiler _könnte_ in diesem speziellen fall erkenne, dass es sich sicher um ein B handelt (und daher evtl. spezielle optimierungen machen, wie z.b. virtuelle funktionsaufrufe auflösen). das bedeutet aber nicht, dass er das immer kann. und warum sollte man ein konstrukt erlauben, nur weil es manchmal möglich ist, falls der compiler schlau genug ist. außerdem zwingt deinen compiler niemand dazu es nicht einfach zu erlauben, wäre dann halt kein standard c++ mehr.</p>
<p>und das zweite (mit den doppelpointern) hat mit dem ersten doch nix zu tun!?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374337</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374337</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Fri, 28 Sep 2007 11:27:13 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-To-Pointer on Fri, 28 Sep 2007 11:30:46 GMT]]></title><description><![CDATA[<p>ich auch nicht......:-)</p>
<p>Aber ich hoffe das CStoll seinen Beitrag etwas erläutert. Er scheint verstanden zu haben, um was es geht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374341</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374341</guid><dc:creator><![CDATA[PhilippMaurer]]></dc:creator><pubDate>Fri, 28 Sep 2007 11:30:46 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-To-Pointer on Fri, 28 Sep 2007 11:36:07 GMT]]></title><description><![CDATA[<p>SRY: ich sollte mal etwas genauer lesen...</p>
<p>also die frage war warum das nicht geht:</p>
<pre><code class="language-cpp">B* b = new B;
A** = &amp;b;
</code></pre>
<p>ganz einfach, weil das auch nicht geht:</p>
<pre><code class="language-cpp">float* blub = new float;
int** pi = &amp;blub;
</code></pre>
<p>wenn du einen pointer auf eine abgeleitete klasse in einen pointer auf eine basisklasse umcastest, kann es sein, dass der pointer dabei verändert werden muss (damit er auch wirklich auf das in der abgeleiteten klasse enthaltene objekt der basisklasse zeigt).</p>
<pre><code class="language-cpp">B* b = new B;
A** a = &amp;b;
</code></pre>
<p>wäre das möglich, würde in so einem fall *a auf das falsche objekt zeigen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374345</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374345</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Fri, 28 Sep 2007 11:36:07 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-To-Pointer on Fri, 28 Sep 2007 11:37:54 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<p>SRY: ich sollte mal etwas genauer lesen...</p>
<p>also die frage war warum das nicht geht:</p>
<pre><code class="language-cpp">B* b = new B;
A** = &amp;b;
</code></pre>
<p>ganz einfach, weil das auch nicht geht:</p>
<pre><code class="language-cpp">float* blub = new float;
int** pi = &amp;blub;
</code></pre>
<p>...</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> <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 />
Also Deine Erklärungsversuche in allen Ehren, aber die hilft hier nicht weiter.<br />
DAS</p>
<pre><code class="language-cpp">float* blub = new float;
int** pi = &amp;blub;
</code></pre>
<p>geht nicht, weil auch</p>
<pre><code class="language-cpp">int* blub = new float;
</code></pre>
<p>nicht geht =&gt; weil int und float keine polymorphen Typen sind.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374348</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374348</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Fri, 28 Sep 2007 11:37:54 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-To-Pointer on Fri, 28 Sep 2007 11:54:09 GMT]]></title><description><![CDATA[<p>jo, A* und B* sind auch keine polymorphen typen!?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374357</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374357</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Fri, 28 Sep 2007 11:54:09 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-To-Pointer on Fri, 28 Sep 2007 11:57:10 GMT]]></title><description><![CDATA[<p>ok, jetzt reden wir über dasselbe. Wie muss der pointer &quot;verändert&quot; werden, damit er auf das richtige Objekt zeigt ? (Pointer enthalten ja eigentlich nur eine Speicheradresse und für den Compiler haben sie noch einen &quot;Typ&quot;).</p>
<p>Wohlgemerkt, das B ja ein A ist !</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374358</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374358</guid><dc:creator><![CDATA[PhilippMaurer]]></dc:creator><pubDate>Fri, 28 Sep 2007 11:57:10 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-To-Pointer on Fri, 28 Sep 2007 12:10:50 GMT]]></title><description><![CDATA[<p>jo, pointer enthalten eine speicheradresse. ein pointer auf ein B zeigt auf den anfang des B objektes. da B von A abgeleitet ist, enthält ein B objekt auch ein A (ein A objekt ist ja ein teil von einem B objekt). deshalb kann man einen zeiger auf ein B auch in einen zeiger auf ein A umwandeln. der zeiger wird einfach so verändert, dass er auf das A in dem B zeigt. üblicherweise steht das A einfach am anfang, dann wäre keine veränderung notwendig, aber das ist implementation defined (es ist also im standard nicht definiert, dass beim upcast der zeiger gleich bleibt). spätestens wenn mehrfachvererbung und virtuelle basisklassen im spiel sind führt kein weg drum herum.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374361</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374361</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Fri, 28 Sep 2007 12:10:50 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-To-Pointer on Fri, 28 Sep 2007 12:56:34 GMT]]></title><description><![CDATA[<p>Ok, vielleicht stelle ich mich mit dem Verstehen etwas blöde an, aber nochmal zurück zum Beispiel:</p>
<p>class A {};<br />
class B: public A {};</p>
<p>B* pB = new B;<br />
A* pA = new A;<br />
A* pAB = pB;</p>
<p>Geht:<br />
A** ppA1 = &amp;pA;<br />
logisch, da pA ein pointer vom Typ A* (auf ein A ist) und man mit einem A** darauf zeigen kann. Typprüfung nachvollziehbar</p>
<p>A** ppA1 = &amp;pAB;<br />
logisch, da pAB ein pointer vom Typ A* (auf ein B ist) und man mit einem A** darauf zeigen kann. Typprüfung nachvollziehbar.</p>
<p>Geht nicht:<br />
A** ppA2 = &amp;pB;<br />
weil pB ein pointer vom Typ B* (auf ein B ist) und man mit einem A** nicht darauf zeigen kann, weil:<br />
man mit einem pointer vom Typ B* nur auf ein B zeigen kann, nicht aber auf ein A (da das die Elternklasse ist). Man kann einem pointer vom Typ B* nicht einen pointer vom Typ A* zuweisen (außer mit dynamic_cast oder static_cast).</p>
<p>Ist das so richtig verstanden ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374369</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374369</guid><dc:creator><![CDATA[PhilippMaurer]]></dc:creator><pubDate>Fri, 28 Sep 2007 12:56:34 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-To-Pointer on Fri, 28 Sep 2007 12:21:12 GMT]]></title><description><![CDATA[<p>jo, ich denk schon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374372</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374372</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Fri, 28 Sep 2007 12:21:12 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-To-Pointer on Fri, 28 Sep 2007 12:26:56 GMT]]></title><description><![CDATA[<p>fast richtig verstanden wuerd ich sagen. Du kannst Zeiger nur auf den zugehoerigen Typen oder einen davon abgeleiteten Typen zeigen lassen. pA sollte also auf ein A oder einen von A abgeleiteten Typen zeigen (wie du richtig erkannt hast). ABER:<br />
ppA ist ein Zeiger auf A*. A* wiederum ist ein Zeiger und kein Nutzerdefinierter Typ, und daher kann man von A* auch nichts baleiten. ergo kann ppA einzig und allein auf A* Variablen zeigen. Die Typen A* und B* haben sogesehen rein garnichts miteinander gemeinsam.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374375</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374375</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 28 Sep 2007 12:26:56 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-To-Pointer on Fri, 28 Sep 2007 12:52:26 GMT]]></title><description><![CDATA[<blockquote>
<p>Die Typen A* und B* haben sogesehen rein garnichts miteinander gemeinsam.</p>
</blockquote>
<p>jo, das war es auch, was mein beispiel mit dem int und dem float aussagen sollte. das beispiel war nur von mir leider &quot;etwas ungut&quot; (saublöd) gewählt^^ sry dafür</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374377</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374377</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Fri, 28 Sep 2007 12:52:26 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-To-Pointer on Fri, 28 Sep 2007 12:38:10 GMT]]></title><description><![CDATA[<p>Hallo Jungs, speziell Pumuckl,</p>
<p>Endlich, ok das ist eine wirklich gute und verständliche Begründung. Jetzt ist alles klar ! Danke !</p>
<p>Das mit Objektgröße/Polymorphie hat mich so wie oben gepostet etwas irritiert.</p>
<p>PS. bleibt immer noch die Frage, warum man C++ nicht so definiert hat, dass es aus dem Zusammenhang A&lt;-&gt;B auch den Zusammenhang A*&lt;-&gt;B* erkennen kann....aber das wäre wohl ein anderer Post</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374382</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374382</guid><dc:creator><![CDATA[PhilippMaurer]]></dc:creator><pubDate>Fri, 28 Sep 2007 12:38:10 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-To-Pointer on Fri, 28 Sep 2007 12:46:49 GMT]]></title><description><![CDATA[<p>PhilippMaurer schrieb:</p>
<blockquote>
<p>Was für ein Schwachsinn !!! Natürlich kann ich einem pointer vom Typ B* einem pointer vom Typ A* zuweisen, mach ich oben ja sogar ! Immer noch ein Rätzel...</p>
</blockquote>
<p>meinst du eine<em>m</em> pointer vom typ B* eine<em>n</em> poiner vom typ A* zuweisen oder umgekehrt?<br />
falls ersteres:<br />
nein, nicht ohne cast</p>
<p>PhilippMaurer schrieb:</p>
<blockquote>
<p>bleibt immer noch die Frage, warum man C++ nicht so definiert hat, dass es aus dem Zusammenhang A&lt;-&gt;B auch den Zusammenhang A*&lt;-&gt;B* erkennen kann....aber das wäre wohl ein anderer Post</p>
</blockquote>
<p>was sollte das:</p>
<pre><code class="language-cpp">A** ppA = &amp;pB;
</code></pre>
<p>deiner meinung nach tun?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374385</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374385</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Fri, 28 Sep 2007 12:46:49 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-To-Pointer on Fri, 28 Sep 2007 12:51:09 GMT]]></title><description><![CDATA[<p>Einen Pointer auf einen B Pointer der auf ein B zeigt, aber vom Typ A**. Da A die Elternklasse von B ist, wären folgende &quot;Zeigerketten&quot; für mich logisch einwandfrei:</p>
<p>A** -&gt; A* -&gt; A (geht in C++)<br />
A** -&gt; A* -&gt; B (geht in C++)</p>
<p>A** -&gt; B* -&gt; B (geht nicht in C++)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374392</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374392</guid><dc:creator><![CDATA[PhilippMaurer]]></dc:creator><pubDate>Fri, 28 Sep 2007 12:51:09 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-To-Pointer on Fri, 28 Sep 2007 13:10:47 GMT]]></title><description><![CDATA[<p>denk mal drüber nach was diese anweisung genau bedeutet:</p>
<pre><code class="language-cpp">A** ppA = &amp;pB;
</code></pre>
<p>einem zeiger auf ein A* wird die adresse eines B* zugewiesen. wie soll das funktionieren? ein B* zeigt ja <strong>nicht</strong> auf ein <em>objekt</em> vom typ A!?<br />
ein B* kann lediglich in ein A* <em>umgewandelt</em> werden. das bedeutet nicht, dass ein B* ein A* <em>ist</em>. nachdem ein B* kein A* ist, wie soll also einem A** die adresse eines B* zugewiesen werde können!?</p>
<p>das ist keine frage der definition von C++, sondern es ist einfach nicht möglich/sinnvoll.</p>
<p>denk dir einfach folgendes:<br />
nehmen wir an deine B objekte sehen im speicher so aus</p>
<pre><code>___________
|         |
|    B    |
| _______ |
| |     | |
| |  A  | |
| |_____| |
|_________|
</code></pre>
<p>ein B* würde auf den beginn des B objektes zeigen. wandelst du den zeiger in einen A* um, dann zeigt das ergebnis auf das A in dem B. der wert des zeigers ist ein anderer. wenn du jetzt einem A** die adresse eines B* zuweisen würdest, dann würde der A** auf einen wert zeigen der nicht auf das A, sondern auf das B zeigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374396</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374396</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Fri, 28 Sep 2007 13:10:47 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-To-Pointer on Fri, 28 Sep 2007 13:06:15 GMT]]></title><description><![CDATA[<p>PhilippMaurer schrieb:</p>
<blockquote>
<p>Einen Pointer auf einen B Pointer der auf ein B zeigt, aber vom Typ A**. Da A die Elternklasse von B ist, wären folgende &quot;Zeigerketten&quot; für mich logisch einwandfrei:</p>
<p>A** -&gt; A* -&gt; A (geht in C++)<br />
A** -&gt; A* -&gt; B (geht in C++)</p>
<p>A** -&gt; B* -&gt; B (geht nicht in C++)</p>
</blockquote>
<p>Hier liegt ein Denkfehler schon beim einfachen Zeiger vor.<br />
Ein B* zeigt immer nur auf ein B und ein A* immer nur auf ein A aber <em>niemals</em> auf ein B. Da A die Basisklasse von B ist, kann ein A* auf ein A-Objekt zeigen, dass das Basisklassensubobjekt eines B-Objektes ist - aber auch dann zeigt unser A* nur auf das A-Subobjekt.<br />
Wenn die Adresse eines B bekannt ist, so lässt sich damit die Adresse das A-Subobjektes in diesem B ermitteln - und C++ ist freundlich genug, das Ganze als implizite Konvertierung zuzulassen - diese Tatsache sagt aber nichts über die Pointerobjekte selbst aus. Wenn ein A** auf ein B* zeigen könnte, setzte das voraus, dass ein B*-Objekt identisch mit einem A*-Objekt ist - aber der innere Aufbau von Pointern ist (nahezu) völlig unbestimmt. Ganz nebenbei muss die Adresse eines Basisklassensubobjektes nicht mit der das vollständigen Objektes übereinstimmen - bei Mehrfachvererbung ist das offensichtlich, aber auch bei Einfachvererbung gibt es diesbezüglich keine Beschränkungen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374401</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374401</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 28 Sep 2007 13:06:15 GMT</pubDate></item></channel></rss>