Dispatch Tabellen

Dispatch Tabellen

Die Tabelle virtueller Methoden (engl.: virtual method table, kurz VMT, vtbl oder vtable) ist ein Ansatz von Compilern objektorientierter Programmiersprachen dynamisches Binden umzusetzen. Das ist unter anderem Grundvoraussetzung für Vererbung und 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.

Zuordnung der Tabellen virtueller Methoden (rechts) zu den Klassen. Dackel erbt von seinem Vorfahren Hund

Jeder Klasse ist eine Tabelle zugeordnet, die den virtuellen Methoden die Adresse der entsprechenden Implementierung zuordnet. In den Sprachen Java, Smalltalk und Python sind dies alle Methoden einer Klasse, in C++ und in C# nur die als „virtuell“ gekennzeichneten. Jedes Objekt besitzt einen versteckten Zeiger auf die Tabelle der Klasse, nach deren Vorgabe es erzeugt wurde.

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.

Wird statt dessen 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.

Implementierung der Klassen in C++:

class Hund
{
	string name_;
public:
	Hund (string name) : name_(name) {}
	virtual ~Hund() {};
	virtual void sitz() const =0;
	virtual void gibLaut() const {cout << "wuff" << endl;}
	virtual void getName() const {cout << name_ << endl;}
};

class Dackel: public Hund
{
public:
	Dackel (string name) : Hund(name) {}
	void sitz() const {cout << "platz" << endl;}
	void gibLaut() const {cout << "wau" << endl;}
};

Ergibt folgende VFT, gewonnen mit:

g++ -fdump-class-hierarchy hund.cpp
Vtable for Hund
Hund::_ZTV4Hund: 7u entries
0     (int (*)(...))0
8     (int (*)(...))(& _ZTI4Hund)
16    Hund::~Hund
24    Hund::~Hund
32    __cxa_pure_virtual
40    Hund::gibLaut
48    Hund::getName

Vtable for Dackel
Dackel::_ZTV6Dackel: 7u entries
0     (int (*)(...))0
8     (int (*)(...))(& _ZTI6Dackel)
16    Dackel::~Dackel
24    Dackel::~Dackel
32    Dackel::sitz
40    Dackel::gibLaut
48    Hund::getName

Verwendet werden kann das dann indem man Funktionen oder Methoden schreibt, die allgemein für einen Hund implementiert sind.

void belle(const Hund &h)
{
	h.sitz();
	h.gibLaut();
}

Übergeben werden kann dann aber ein Dackel, oder eine beliebige andere Hunderasse die vielleicht später hinzugefügt wird:

int main()
{
	Dackel d("bello");
	belle (d);
}

Das Beispiel soll das Konzept zeigen: An der Verwendungsstelle soll/darf zur Compilierzeit 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.


Wikimedia Foundation.

Игры ⚽ Нужна курсовая?

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Anton Fleischer — Antonín Fleischer, auch Anton Fleischer (* 17. Februar 1850 in Rověčín, Mähren; † 22. Oktober 1934 in Brünn) war ein tschechischer Entomologe und Koleopterologe. Leben Fleischer war Sohn des evangelischen Pfarrers von Rověčín. Er begann während… …   Deutsch Wikipedia

  • Antonin Fleischer — Antonín Fleischer, auch Anton Fleischer (* 17. Februar 1850 in Rověčín, Mähren; † 22. Oktober 1934 in Brünn) war ein tschechischer Entomologe und Koleopterologe. Leben Fleischer war Sohn des evangelischen Pfarrers von Rověčín. Er begann während… …   Deutsch Wikipedia

  • Fishing — Phishing [ˈfɪʃɪŋ] werden Versuche genannt, über gefälschte WWW Adressen an Daten eines Internet Benutzers zu gelangen. Der Begriff ist ein englisches Kunstwort, das sich an fishing („Angeln“, „Fischen“[1]), evtl. in Anlehnung an Phreaking auch… …   Deutsch Wikipedia

  • Hans Landolt — Hans Heinrich Landolt (* 5. Dezember 1831 in Zürich; † 15. März 1910 in Berlin Wilmersdorf, Deutschland) war ein Schweizer Chemiker. Sein Name ist bis heute mit dem Standardwerk Physikalisch chemische Tabellen verknüpft, besser bekannt als der… …   Deutsch Wikipedia

  • Phisher — Phishing [ˈfɪʃɪŋ] werden Versuche genannt, über gefälschte WWW Adressen an Daten eines Internet Benutzers zu gelangen. Der Begriff ist ein englisches Kunstwort, das sich an fishing („Angeln“, „Fischen“[1]), evtl. in Anlehnung an Phreaking auch… …   Deutsch Wikipedia

  • Pishing — Phishing [ˈfɪʃɪŋ] werden Versuche genannt, über gefälschte WWW Adressen an Daten eines Internet Benutzers zu gelangen. Der Begriff ist ein englisches Kunstwort, das sich an fishing („Angeln“, „Fischen“[1]), evtl. in Anlehnung an Phreaking auch… …   Deutsch Wikipedia

  • RDBM — Eine relationale Datenbank dient zur elektronischen Datenverwaltung in Computersystemen und beruht auf dem relationalen Datenbankmodell. Dieses wurde 1970 von Edgar F. Codd erstmals vorgeschlagen und ist bis heute, trotz einiger Kritikpunkte, ein …   Deutsch Wikipedia

  • RDBMS — Eine relationale Datenbank dient zur elektronischen Datenverwaltung in Computersystemen und beruht auf dem relationalen Datenbankmodell. Dieses wurde 1970 von Edgar F. Codd erstmals vorgeschlagen und ist bis heute, trotz einiger Kritikpunkte, ein …   Deutsch Wikipedia

  • Relational Database Management System — Eine relationale Datenbank dient zur elektronischen Datenverwaltung in Computersystemen und beruht auf dem relationalen Datenbankmodell. Dieses wurde 1970 von Edgar F. Codd erstmals vorgeschlagen und ist bis heute, trotz einiger Kritikpunkte, ein …   Deutsch Wikipedia

  • Relational Database Management Systems — Eine relationale Datenbank dient zur elektronischen Datenverwaltung in Computersystemen und beruht auf dem relationalen Datenbankmodell. Dieses wurde 1970 von Edgar F. Codd erstmals vorgeschlagen und ist bis heute, trotz einiger Kritikpunkte, ein …   Deutsch Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”