<?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[vtable]]></title><description><![CDATA[<p>base.hxx</p>
<pre><code class="language-cpp">#ifndef _base_hxx_
#define _base_hxx_
class base
{
public:
   virtual void foo();
   virtual void foo2();
   virtual ~base();

};
#endif
</code></pre>
<p>derived.hxx</p>
<pre><code class="language-cpp">#ifndef _derived_hxx_
#define _derived_hxx_
#include &quot;base.hxx&quot;
class derived : public base
{
   ~derived();
   void foo();

};
#endif
</code></pre>
<p>base.cpp</p>
<pre><code class="language-cpp">#include &quot;base.hxx&quot;
#include &lt;iostream&gt;
using namespace std;
void base::foo()
{
   cout&lt;&lt;&quot;base::foo()&quot;&lt;&lt;endl;
}

void base::foo2()
{
 cout&lt;&lt;&quot;base::foo2()&quot;&lt;&lt;endl;
}

base::~base()
{
   cout&lt;&lt;&quot;base::~base()&quot;&lt;&lt;endl;
}
</code></pre>
<p>derived.cpp</p>
<pre><code class="language-cpp">#include &quot;derived.hxx&quot;
#include &lt;iostream&gt;
using namespace std;

derived::~derived()
{
    cout&lt;&lt;&quot;derived::~derived()&quot;&lt;&lt;endl;
}
void derived::foo()
{
   cout&lt;&lt;&quot;derived::foo()&quot;&lt;&lt;endl;
}
</code></pre>
<p>main.cpp</p>
<pre><code class="language-cpp">#include &quot;base.hxx&quot;
#include &quot;derived.hxx&quot;

int main()
{
   base *bp = new derived(); //was passiert hier intern?
   bp-&gt;foo();
   bp-&gt;foo2();
   delete bp;
   base *bp2 = new base();
   bp2-&gt;foo();
   bp2-&gt;foo2();
   delete bp2;
   return 0;
}
</code></pre>
<p>meine Frage:<br />
1. in Debug wenn:</p>
<pre><code class="language-cpp">base *bp = new derived();
</code></pre>
<p>aufgerufen wird.<br />
in Watch-Fenster :<br />
bp hat 2 Einträge<br />
[derived] und __vfptr<br />
in [derived] gibt es ein base Eintrag drunter wieder einmal __vfptr<br />
diese __vfptr ist gleich wie o.g. __vfptr. wieso zeigt es 2 mal?<br />
2. in __vfptr gibt es 3 Einträge, anscheinend __vfptr ist ein Zeiger auf ein pointer-Array.<br />
[0]:derived::foo(void)<br />
[1]:base::foo2(void)<br />
[2]:derived::'scalar detecting destructor(unsigned int)'<br />
aber was passiert wenn</p>
<pre><code class="language-cpp">base *bp = new derived();
</code></pre>
<p>aufgerufen wird?<br />
Meine Vermutung war :<br />
ein vtable wird erzeugt mit 3 Einträge</p>
<blockquote>
<p>[0] Adresse von base::foo()<br />
[1] Adresse von base::foo2()<br />
[2] Adresse von base::~base()</p>
</blockquote>
<p>dann wird &quot;new derived()&quot; aufgerufen, damit die Adress von base::foo überschreibt mit Adresse von derived::foo(), weil base::foo2() nicht von derived überschrieben, bleibt der Eintrag.Aber die Adresse von base::~base() wird auch überschrieben? dann haben wir am Ende</p>
<blockquote>
<p>[0] Adresse von derived::foo()<br />
[1] Adresse von base::foo2()<br />
[2] Adresse von derived::~derived()</p>
</blockquote>
<p>dann</p>
<pre><code class="language-cpp">1. bp-&gt;foo(); //derived::foo()
2. bp-&gt;foo2(); //base::foo2()
3. delete bp;  //derived::~derived()
</code></pre>
<p>mit 3. stimmt es nicht, deswegen könnte es sein, statt base::~base() zu überschreiben, wird ein derived::~derived()davor hinzufügt. Also<br />
Vtable sieht so aus (nach Instanzierung):</p>
<blockquote>
<p>[0] Adresse von derived::foo()<br />
[1] Adresse von base::foo2()<br />
[2] Adresse von derived::~derived()<br />
[3] Adresse von base::~base()</p>
</blockquote>
<p>Ist meine Vermutung richtig??</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/149615/vtable</link><generator>RSS for Node</generator><lastBuildDate>Sat, 05 Sep 2026 08:33:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/149615.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 07 Jun 2006 19:02:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to vtable on Wed, 07 Jun 2006 19:02:56 GMT]]></title><description><![CDATA[<p>base.hxx</p>
<pre><code class="language-cpp">#ifndef _base_hxx_
#define _base_hxx_
class base
{
public:
   virtual void foo();
   virtual void foo2();
   virtual ~base();

};
#endif
</code></pre>
<p>derived.hxx</p>
<pre><code class="language-cpp">#ifndef _derived_hxx_
#define _derived_hxx_
#include &quot;base.hxx&quot;
class derived : public base
{
   ~derived();
   void foo();

};
#endif
</code></pre>
<p>base.cpp</p>
<pre><code class="language-cpp">#include &quot;base.hxx&quot;
#include &lt;iostream&gt;
using namespace std;
void base::foo()
{
   cout&lt;&lt;&quot;base::foo()&quot;&lt;&lt;endl;
}

void base::foo2()
{
 cout&lt;&lt;&quot;base::foo2()&quot;&lt;&lt;endl;
}

base::~base()
{
   cout&lt;&lt;&quot;base::~base()&quot;&lt;&lt;endl;
}
</code></pre>
<p>derived.cpp</p>
<pre><code class="language-cpp">#include &quot;derived.hxx&quot;
#include &lt;iostream&gt;
using namespace std;

derived::~derived()
{
    cout&lt;&lt;&quot;derived::~derived()&quot;&lt;&lt;endl;
}
void derived::foo()
{
   cout&lt;&lt;&quot;derived::foo()&quot;&lt;&lt;endl;
}
</code></pre>
<p>main.cpp</p>
<pre><code class="language-cpp">#include &quot;base.hxx&quot;
#include &quot;derived.hxx&quot;

int main()
{
   base *bp = new derived(); //was passiert hier intern?
   bp-&gt;foo();
   bp-&gt;foo2();
   delete bp;
   base *bp2 = new base();
   bp2-&gt;foo();
   bp2-&gt;foo2();
   delete bp2;
   return 0;
}
</code></pre>
<p>meine Frage:<br />
1. in Debug wenn:</p>
<pre><code class="language-cpp">base *bp = new derived();
</code></pre>
<p>aufgerufen wird.<br />
in Watch-Fenster :<br />
bp hat 2 Einträge<br />
[derived] und __vfptr<br />
in [derived] gibt es ein base Eintrag drunter wieder einmal __vfptr<br />
diese __vfptr ist gleich wie o.g. __vfptr. wieso zeigt es 2 mal?<br />
2. in __vfptr gibt es 3 Einträge, anscheinend __vfptr ist ein Zeiger auf ein pointer-Array.<br />
[0]:derived::foo(void)<br />
[1]:base::foo2(void)<br />
[2]:derived::'scalar detecting destructor(unsigned int)'<br />
aber was passiert wenn</p>
<pre><code class="language-cpp">base *bp = new derived();
</code></pre>
<p>aufgerufen wird?<br />
Meine Vermutung war :<br />
ein vtable wird erzeugt mit 3 Einträge</p>
<blockquote>
<p>[0] Adresse von base::foo()<br />
[1] Adresse von base::foo2()<br />
[2] Adresse von base::~base()</p>
</blockquote>
<p>dann wird &quot;new derived()&quot; aufgerufen, damit die Adress von base::foo überschreibt mit Adresse von derived::foo(), weil base::foo2() nicht von derived überschrieben, bleibt der Eintrag.Aber die Adresse von base::~base() wird auch überschrieben? dann haben wir am Ende</p>
<blockquote>
<p>[0] Adresse von derived::foo()<br />
[1] Adresse von base::foo2()<br />
[2] Adresse von derived::~derived()</p>
</blockquote>
<p>dann</p>
<pre><code class="language-cpp">1. bp-&gt;foo(); //derived::foo()
2. bp-&gt;foo2(); //base::foo2()
3. delete bp;  //derived::~derived()
</code></pre>
<p>mit 3. stimmt es nicht, deswegen könnte es sein, statt base::~base() zu überschreiben, wird ein derived::~derived()davor hinzufügt. Also<br />
Vtable sieht so aus (nach Instanzierung):</p>
<blockquote>
<p>[0] Adresse von derived::foo()<br />
[1] Adresse von base::foo2()<br />
[2] Adresse von derived::~derived()<br />
[3] Adresse von base::~base()</p>
</blockquote>
<p>Ist meine Vermutung richtig??</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1073395</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1073395</guid><dc:creator><![CDATA[netrobot]]></dc:creator><pubDate>Wed, 07 Jun 2006 19:02:56 GMT</pubDate></item><item><title><![CDATA[Reply to vtable on Wed, 07 Jun 2006 21:13:15 GMT]]></title><description><![CDATA[<p>Welchen Compiler benutzt du überhaupt? Die Implementation von vtables kann von Compiler zu Compiler abweichen.</p>
<p>Meistens ist ein vtable ein zur Compilezeit erstelltes Array von Methoden. Jede Klasse mit virtuellen Methoden (sowie davon abgeleitete Klassen) enthalten zusätzlich eine versteckte Objektvariable, welche die Adresse des zur Klasse gehörenden vtables enthält. Erzeugst du also in Objekt von 'base', zeigt diese Variable auf den vtable von 'base' und entsprechend bei einem Objekt von 'derived' auf dessen vtable. Der Aufruf von virtuellen Methoden ist auch anders als bei anderen. Sinngemäß könnte man do formulieren: &quot;object-&gt;_vptr[1]();&quot; würde z.B. die zweite virtuelle Methode des Objektes 'object' aufrufen, wenn _vptr ein Zeiger auf den vtable ist.</p>
<p>Die vtables deiner Klassen sehen ungefähr so aus:</p>
<p>bei 'base':<br />
base::foo()<br />
base::foo2()<br />
base::~base()</p>
<p>bei 'derived':<br />
derived::foo()<br />
base::foo2()<br />
derived::~base()</p>
<p>&quot;object-&gt;foo();&quot; ruft dann _vptr[0] auf, welches je nach Klasse auf 'base::foo' oder 'derived:foo' zeigt.</p>
<p>Ich hoffe, dass ich das verständlich rüberbringen konnte <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>PS: '.hxx' habe ich noch nie gesehen - ich kenne nur '.h' und '.hpp' :p<br />
Hat das ne spezielle Bedeutung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1073409</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1073409</guid><dc:creator><![CDATA[Neku]]></dc:creator><pubDate>Wed, 07 Jun 2006 21:13:15 GMT</pubDate></item><item><title><![CDATA[Reply to vtable on Wed, 07 Jun 2006 20:01:55 GMT]]></title><description><![CDATA[<p>1. Compiler : VC7<br />
2.</p>
<blockquote>
<p>&quot;object-&gt;foo();&quot; ruft dann _vptr[0] auf, welches je nach Klasse auf 'base::foo' oder 'derived:foo' zeigt.</p>
</blockquote>
<p>es erklärt aber nicht D'tor und es anscheind nur eine Tabelle existiert, aber 2 pointer auf die selbe Tabelle</p>
<pre><code>Name                   Value
-bp                    0x00370a90
 -[derived]            {...}
   -[base]             {...} 
     -__vfptr          0x004410fc const derived::'vftable'
      |- [0]           0x00415a0a derived::foo(void) 
      |- [1]           0x00415776 base::foo(void)  
      |- [2]           0x00415ece derived::'scalar deleting destructor'unsigned int
 -__vfptr              0x004410fc const derived::'vftable'
      |- [0]           0x00415a0a derived::foo(void)
      |- [1]           0x00415776 base::foo(void)  
      |- [2]           0x00415ece derived::'scalar deleting destructor'unsigned
</code></pre>
<p>3. hxx zumindest kann ich unter vc benutzen, es ist nur ein ASCII text, &quot;hxx, h, hpp, hyy, hxy&quot; sollte egal sein</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1073444</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1073444</guid><dc:creator><![CDATA[netrobot]]></dc:creator><pubDate>Wed, 07 Jun 2006 20:01:55 GMT</pubDate></item><item><title><![CDATA[Reply to vtable on Wed, 07 Jun 2006 21:27:41 GMT]]></title><description><![CDATA[<p>Es existiert nur ein vfptr für das Objekt, es wird wohl nur für jede Klasse gesondert angezeigt.<br />
Welches Problem hast du mit dem Destruktor? Ich verstehe leider nicht, was du meinst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1073484</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1073484</guid><dc:creator><![CDATA[Neku]]></dc:creator><pubDate>Wed, 07 Jun 2006 21:27:41 GMT</pubDate></item><item><title><![CDATA[Reply to vtable on Wed, 07 Jun 2006 21:25:29 GMT]]></title><description><![CDATA[<blockquote>
<p>bei 'base':<br />
base::foo()<br />
base::foo2()<br />
base::~base()</p>
<p>bei 'derived':<br />
derived::foo()<br />
base::foo2()<br />
derived::~base()</p>
</blockquote>
<p>ok, verstehe, 'derived' soll so aussehen</p>
<pre><code>derived::foo()
base::foo2()
derived::~derived()
derived::~base()
</code></pre>
<p>spielt die Reihenfolge eine Rolle? bzw, wie wird die Reihenfolge festgelegt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1073489</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1073489</guid><dc:creator><![CDATA[netrobot]]></dc:creator><pubDate>Wed, 07 Jun 2006 21:25:29 GMT</pubDate></item><item><title><![CDATA[Reply to vtable on Wed, 07 Jun 2006 21:27:28 GMT]]></title><description><![CDATA[<p>Die Reihenfolge ist bei VC++ die, in der du die Methoden deklarierst. Der vtable von 'derived' enthält den Destruktor dieser Klasse, wobei dieser dann am Ende noch den Destruktor von 'base' aufruft.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1073491</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1073491</guid><dc:creator><![CDATA[Neku]]></dc:creator><pubDate>Wed, 07 Jun 2006 21:27:28 GMT</pubDate></item><item><title><![CDATA[Reply to vtable on Wed, 07 Jun 2006 21:35:19 GMT]]></title><description><![CDATA[<p>es muss zwischen</p>
<pre><code>derived::~derived()
derived::~base()
</code></pre>
<p>eine Beziehung geben, sonst wird derived::~base() nicht automatisch aufgerufen wenn du hier delete bp aufrufst(implizit derived::~derived() aufrufen)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1073494</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1073494</guid><dc:creator><![CDATA[netrobot]]></dc:creator><pubDate>Wed, 07 Jun 2006 21:35:19 GMT</pubDate></item><item><title><![CDATA[Reply to vtable on Wed, 07 Jun 2006 21:46:36 GMT]]></title><description><![CDATA[<p>Es gibt kein &quot;derived::~base();&quot;.</p>
<p>Das ganze läuft so:</p>
<pre><code class="language-cpp">base* b = new derived();
delete b; // ruft Destruktor über &quot;b-&gt;_vfptr[2](...)&quot;, also &quot;b-&gt;~derived(...)&quot; auf.

// intern sieht der Destruktor dann ungefähr so aus:

derived::~derived (...)
{
   // eigener Code, Speicherbereinigung etc.
   base::~base();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1073500</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1073500</guid><dc:creator><![CDATA[Neku]]></dc:creator><pubDate>Wed, 07 Jun 2006 21:46:36 GMT</pubDate></item><item><title><![CDATA[Reply to vtable on Wed, 07 Jun 2006 21:47:12 GMT]]></title><description><![CDATA[<p>wenn es so ist, dann steht base::base nicht auf der Vtable von derived, richtig?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1073502</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1073502</guid><dc:creator><![CDATA[netrobot]]></dc:creator><pubDate>Wed, 07 Jun 2006 21:47:12 GMT</pubDate></item><item><title><![CDATA[Reply to vtable on Wed, 07 Jun 2006 21:48:00 GMT]]></title><description><![CDATA[<p>richtig</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1073503</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1073503</guid><dc:creator><![CDATA[Neku]]></dc:creator><pubDate>Wed, 07 Jun 2006 21:48:00 GMT</pubDate></item><item><title><![CDATA[Reply to vtable on Thu, 08 Jun 2006 20:26:29 GMT]]></title><description><![CDATA[<p>wenn ich ein derived class noch eine virtual funktion hinzufüge</p>
<pre><code>virtual foo3();
</code></pre>
<p>dann soll es in der vtable so aussehen:</p>
<pre><code>bei 'derived':
derived::foo()
base::foo2()
derived::foo3()
derived::~derived()
</code></pre>
<p>und bei</p>
<pre><code class="language-cpp">base *bp = new derived;
</code></pre>
<p>aber ich zur Laufzeit einen Zeiger erzeugt, der auf diese Table zeigt.<br />
dann soll ich auch kein problem</p>
<pre><code class="language-cpp">bp-&gt;foo3();
</code></pre>
<p>aufrufen ohne downcast. Aber in der Praxis muss ich immer</p>
<pre><code class="language-cpp">static_cast&lt;derived*&gt;(bp)-&gt;foo3();
</code></pre>
<p>schreiben, wieso??</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1074183</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1074183</guid><dc:creator><![CDATA[netrobot]]></dc:creator><pubDate>Thu, 08 Jun 2006 20:26:29 GMT</pubDate></item><item><title><![CDATA[Reply to vtable on Thu, 08 Jun 2006 20:37:52 GMT]]></title><description><![CDATA[<p>Ganz einfach, weil foo3 nicht in der Basisklasse definiert ist. Du kannst so nur das aufrufen was auch in der Basisklasse definiert ist. Wenn du also auch foo3 mit einem Zeiger auf base aufrufen willst, musst du es auch in der Basisklasse definieren. Wenn du etwas ohne cast aufrufen willst musst du es auch definiert haben. Die Basisklasse kann ja nicht etwas kennen, was erst in einer abgeleiteten Klasse vorkommt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1074188</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1074188</guid><dc:creator><![CDATA[Vellas]]></dc:creator><pubDate>Thu, 08 Jun 2006 20:37:52 GMT</pubDate></item><item><title><![CDATA[Reply to vtable on Thu, 08 Jun 2006 20:54:43 GMT]]></title><description><![CDATA[<blockquote>
<p>Ganz einfach, weil foo3 nicht in der Basisklasse definiert ist. Du kannst so nur das aufrufen was auch in der Basisklasse definiert ist. Wenn du also auch foo3 mit einem Zeiger auf base aufrufen willst, musst du es auch in der Basisklasse definieren. Wenn du etwas ohne cast aufrufen willst musst du es auch definiert haben. Die Basisklasse kann ja nicht etwas kennen, was erst in einer abgeleiteten Klasse vorkommt.</p>
</blockquote>
<p>nach der Theorie von vorhin muss es doch möglich sein.<br />
wir reden jetzt über die beiden vtables<br />
Zur Compilerzeit wird 2 vtables erzeugt, also statisch, existiert zu diesem Zeitpunkt noch keiner Zeiger zu den beiden Tabellen.<br />
vtable von base:</p>
<blockquote>
<p>table 1 bei 'base':<br />
[0] base::foo()<br />
[1] base::foo2()<br />
[2] base::~base()</p>
<p>table2 bei 'derived':<br />
[0] derived::foo()<br />
[1] base::foo2()<br />
[2] derived::foo3()<br />
[3] derived::~derived()</p>
</blockquote>
<p>bei Aufruf:</p>
<pre><code class="language-cpp">base *bp = new derived;
</code></pre>
<p>wird ein Zeiger this erzeugt, was auf table2 zeigt.Durch diesen Zeiger kann ich natürlich auch foo3()aufrufen, etwa this[2]-&gt;foo3();</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1074197</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1074197</guid><dc:creator><![CDATA[netrobot]]></dc:creator><pubDate>Thu, 08 Jun 2006 20:54:43 GMT</pubDate></item><item><title><![CDATA[Reply to vtable on Thu, 08 Jun 2006 21:06:17 GMT]]></title><description><![CDATA[<p>Welche Funktionen wirklich zur Verfügung stehen, steht aber erst zur Laufzeit fest. Dein Compiler guckt nicht nach welche Funktionen er aufrufen kann, sondern welche definiert sind. Wenn du jetzt statt derived eine derived2-Klasse hast und diese hat foo4, nicht aber foo3 würde der aufruf nicht mehr klappen. Und wenn du sowas über ein switch-case-Konstrukt oder so entscheidest welche abgeleitete Klasse verwendet werden soll kann das nicht funktionieren, weil der Compiler das nicht zur Compile-Time auswerten kann. Dann musst du explizit den Typ angeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1074206</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1074206</guid><dc:creator><![CDATA[Vellas]]></dc:creator><pubDate>Thu, 08 Jun 2006 21:06:17 GMT</pubDate></item><item><title><![CDATA[Reply to vtable on Thu, 08 Jun 2006 21:09:28 GMT]]></title><description><![CDATA[<p>netrobot schrieb:</p>
<blockquote>
<p>vtable von base:</p>
<blockquote>
<p>table 1 bei 'base':<br />
[0] base::foo()<br />
[1] base::foo2()<br />
[2] base::~base()</p>
<p>table2 bei 'derived':<br />
[0] derived::foo()<br />
[1] base::foo2()<br />
[2] derived::foo3()<br />
[3] derived::~derived()</p>
</blockquote>
</blockquote>
<p>die einträge der vtable der abgeleiteten klasse müssen nat. exakt mit denen der basisklasse korrespondieren. denn ein virtueller funktionsaufruf vberuht ja gerade darauf, dass ein bestimmter eintrag, welcher einer bestimmten virtuellen funktion zugeordnet ist, aufgerufen wird. folglich:</p>
<pre><code>[0] derived::foo()
[1] base::foo2()
[2] derived::~derived()
[3] derived::foo3()
</code></pre>
<blockquote>
<p>bei Aufruf:</p>
<pre><code class="language-cpp">base *bp = new derived;
</code></pre>
<p>wird ein Zeiger this erzeugt, was auf table2 zeigt.Durch diesen Zeiger kann ich natürlich auch foo3()aufrufen, etwa this[2]-&gt;foo3();</p>
</blockquote>
<p>das ist dem zeiger base aber nicht zu entnehmen. insbesondere ist der name foo3 überhaupt nicht in der basisklasse bekannt. letzlich fehlen hier eher ein paar grundlagen in OO. eine bestimmte implementation dazu zu benutzen, dies zu lernen, ist eher ungünstig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1074208</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1074208</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 08 Jun 2006 21:09:28 GMT</pubDate></item><item><title><![CDATA[Reply to vtable on Thu, 08 Jun 2006 21:29:06 GMT]]></title><description><![CDATA[<p>ich verstehe nicht ganz, in manchen Dokumenten steht z.b.</p>
<pre><code class="language-cpp">base *bp = new derived;
</code></pre>
<blockquote>
<p>bp ist ein Zeiger von Type base, aber auf derived zeigt.</p>
</blockquote>
<p>in asm ist bp ist einfach ein Variable, drin ist eine Adresse, z.B. 0x1000, ab dieser Adress vorwärts (increment) wurde class derived abgelegt. Hier ist &quot;base&quot;ein platzhalter ohne wirkliche Bedeutung.<br />
ist es nicht so? oder kann jd von der asm Sicht erklären?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1074220</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1074220</guid><dc:creator><![CDATA[netrobot]]></dc:creator><pubDate>Thu, 08 Jun 2006 21:29:06 GMT</pubDate></item><item><title><![CDATA[Reply to vtable on Thu, 08 Jun 2006 21:57:54 GMT]]></title><description><![CDATA[<p>Mit &quot;bp&quot; wollte man wohl nur sagen, dass die Variable ein 'base'-'pointer' (also ein Pointer auf ein Objekt der Klasse 'base', eben 'bp') ist <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>derived ist doch nichts anderes, als eine Erweiterung von base. Man kann ein Objekt von derived wie ein Objekt von base benutzen, aber halt nicht umgekehrt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1074229</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1074229</guid><dc:creator><![CDATA[Neku]]></dc:creator><pubDate>Thu, 08 Jun 2006 21:57:54 GMT</pubDate></item></channel></rss>