<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Tabelle_virtueller_Methoden</id>
	<title>Tabelle virtueller Methoden - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Tabelle_virtueller_Methoden"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Tabelle_virtueller_Methoden&amp;action=history"/>
	<updated>2026-05-25T16:57:22Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Tabelle_virtueller_Methoden&amp;diff=381386&amp;oldid=prev</id>
		<title>imported&gt;Filzstift: /* top */BKL-fix, replaced: .NET → .NET mit AWB</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Tabelle_virtueller_Methoden&amp;diff=381386&amp;oldid=prev"/>
		<updated>2022-05-31T06:50:14Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;top: &lt;/span&gt;BKL-fix, replaced: &lt;a href=&quot;/index.php?title=.NET&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;.NET (Seite nicht vorhanden)&quot;&gt;.NET&lt;/a&gt; → &lt;a href=&quot;/index.php/.Net-Framework&quot; title=&quot;.Net-Framework&quot;&gt;.NET&lt;/a&gt; mit &lt;a href=&quot;/index.php/Wikipedia:AWB&quot; class=&quot;mw-redirect&quot; title=&quot;Wikipedia:AWB&quot;&gt;AWB&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Die &amp;#039;&amp;#039;&amp;#039;Tabelle virtueller Methoden&amp;#039;&amp;#039;&amp;#039; ({{enS|virtual method table}} oder &amp;#039;&amp;#039;{{lang|en|virtual function table}}&amp;#039;&amp;#039;, kurz &amp;#039;&amp;#039;VMT&amp;#039;&amp;#039;, &amp;#039;&amp;#039;VFT&amp;#039;&amp;#039;, &amp;#039;&amp;#039;vtbl&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;vtable&amp;#039;&amp;#039;) ist ein Ansatz von [[Compiler]]n [[objektorientierte Programmierung|objektorientierter]] [[Programmiersprache]]n, um [[dynamisches Binden]] umzusetzen. Das ist unter anderem Grundvoraussetzung für [[Vererbung (Programmierung)|Vererbung]] und [[Polymorphie (Programmierung)|Polymorphie]]. Eine Tabelle virtueller Methoden ist eine [[Datenstruktur]], die Methoden auf konkrete Realisierungen (Implementierung dieser Methode) abbildet. Anstatt die Realisierungen direkt anzusprechen, werden sie mit Hilfe der Tabelle indirekt adressiert.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Tabelle virtueller Methoden.png|mini|340px|Zuordnung der Tabellen virtueller Methoden (rechts) zu den Klassen. &amp;lt;span style=&amp;quot;font-family:monospace;&amp;quot;&amp;gt;Dackel&amp;lt;/span&amp;gt; erbt von seinem Vorfahren &amp;lt;span style=&amp;quot;font-family:monospace;&amp;quot;&amp;gt;Hund&amp;lt;/span&amp;gt;]]&lt;br /&gt;
Jeder [[Klasse (Objektorientierung)|Klasse]] ist eine Tabelle zugeordnet, die den [[Virtuelle Methode|virtuellen Methoden]] die Adresse der entsprechenden [[Implementierung]] zuordnet. In den Sprachen [[Java (Programmiersprache)|Java]], [[Smalltalk (Programmiersprache)|Smalltalk]] und [[Python (Programmiersprache)|Python]] sind dies alle Methoden einer Klasse, in [[C++]], den [[.Net-Framework|.NET]]-Sprachen&amp;lt;ref group=&amp;quot;A&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-family:monospace;&amp;quot;&amp;gt;virtual&amp;lt;/span&amp;gt; in C#,  &amp;lt;span style=&amp;quot;font-family:monospace;&amp;quot;&amp;gt;Overridable&amp;lt;/span&amp;gt; in [[VB.NET]]&amp;lt;/ref&amp;gt; und [[Object Pascal]] nur die als „virtuell“ gekennzeichneten. Jedes Objekt besitzt einen versteckten Zeiger auf die Tabelle der Klasse, nach deren Vorgabe es erzeugt wurde.&lt;br /&gt;
&lt;br /&gt;
Der Aufruf einer nicht-virtuellen Methode wird vom Compiler durch den direkten Aufruf der Implementierung übersetzt. Diese wird anhand des beim Aufruf angenommenen Typs des Objektes ermittelt. Tritt demnach ein polymorphes Objekt in der Gestalt eines seiner Vorfahren auf, so hat es den Typ des Vorfahren und es wird somit dessen Implementierung genutzt.&lt;br /&gt;
&lt;br /&gt;
Wird stattdessen eine virtuelle Methode aufgerufen, so übersetzt der Compiler dies in einen indirekten Aufruf der in der Tabelle adressierten Implementierung. Diese hängt nicht von dem in der Referenz auf das Objekt angenommenen Typ des Objektes ab, sondern jeweils vom ursprünglichen Typ des Objektes selbst.&lt;br /&gt;
&lt;br /&gt;
Implementierung der Klassen in C++:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
class Hund&lt;br /&gt;
{&lt;br /&gt;
private:&lt;br /&gt;
	string name_;&lt;br /&gt;
public:&lt;br /&gt;
	Hund (string name) : name_(name) {}&lt;br /&gt;
	virtual ~Hund() {};&lt;br /&gt;
	virtual void sitz() const =0;&lt;br /&gt;
	virtual void gibLaut() const {cout &amp;lt;&amp;lt; &amp;quot;wuff&amp;quot; &amp;lt;&amp;lt; endl;}&lt;br /&gt;
	virtual void getName() const {cout &amp;lt;&amp;lt; name_ &amp;lt;&amp;lt; endl;}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class Dackel: public Hund&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
	Dackel (string name) : Hund(name) {}&lt;br /&gt;
	void sitz() const {cout &amp;lt;&amp;lt; &amp;quot;platz&amp;quot; &amp;lt;&amp;lt; endl;}&lt;br /&gt;
	void gibLaut() const {cout &amp;lt;&amp;lt; &amp;quot;wau&amp;quot; &amp;lt;&amp;lt; endl;}&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ergibt folgende VFT, gewonnen mit:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
 g++ -fdump-class-hierarchy hund.cpp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 Vtable for Hund&lt;br /&gt;
 Hund::_ZTV4Hund: 7u entries&lt;br /&gt;
 0     (int (*)(...))0&lt;br /&gt;
 8     (int (*)(...))(&amp;amp; _ZTI4Hund)&lt;br /&gt;
 16    Hund::~Hund&lt;br /&gt;
 24    Hund::~Hund&lt;br /&gt;
 32    __cxa_pure_virtual&lt;br /&gt;
 40    Hund::gibLaut&lt;br /&gt;
 48    Hund::getName&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 Vtable for Dackel&lt;br /&gt;
 Dackel::_ZTV6Dackel: 7u entries&lt;br /&gt;
 0     (int (*)(...))0&lt;br /&gt;
 8     (int (*)(...))(&amp;amp; _ZTI6Dackel)&lt;br /&gt;
 16    Dackel::~Dackel&lt;br /&gt;
 24    Dackel::~Dackel&lt;br /&gt;
 32    Dackel::sitz&lt;br /&gt;
 40    Dackel::gibLaut&lt;br /&gt;
 48    Hund::getName&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verwendet werden kann das dann, indem man Funktionen oder Methoden schreibt, die allgemein für einen Hund implementiert sind.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void belle(const Hund &amp;amp;h)&lt;br /&gt;
{&lt;br /&gt;
	h.sitz();&lt;br /&gt;
	h.gibLaut();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Übergeben werden kann dann aber ein Dackel oder eine beliebige andere Hunderasse, die vielleicht später hinzugefügt wird:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	Dackel d(&amp;quot;Bello&amp;quot;);&lt;br /&gt;
	belle (d);&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das Beispiel soll das Konzept zeigen: An der Verwendungsstelle soll/darf zur Kompilierzeit die konkrete Ausprägung eines Objektes nicht bekannt sein. Das Objekt ist über den Typ einer Basisklasse bekannt. Der Aufruf einer Klassenfunktion führt aber immer zum Aufruf der Funktion, die dem Typ der tatsächlichen Instanz zugehört.&lt;br /&gt;
&lt;br /&gt;
== Anmerkungen ==&lt;br /&gt;
&amp;lt;references group=&amp;quot;A&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Objektorientierte Programmierung]]&lt;br /&gt;
[[Kategorie:Compilerbau]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Filzstift</name></author>
	</entry>
</feed>