011
12.10.2007, 15:15 Uhr
0xdeadbeef
Gott (Operator)
|
virtual bedeutet, dass die Funktion in der virtuellen Funktionstabelle der Klasse als Funktionszeiger abgelegt wird. Das heißt, im Vergleich zu einem normalen Funktionsaufruf frisst ein virtueller Funktionsaufruf zwei Dereferenzierungen mehr (einmal vtbl, einmal Funktion). Man könnte sich das etwa so vorstellen:
C++: |
struct foo { void bar(); virtual void baz(); };
|
in C++ ist etwa äquivalent zu
C++: |
struct foo;
struct foo_vtbl { void (*baz)(struct foo *); };
struct foo { struct foo_vtbl *vtbl; };
void foo_bar(foo *this);
|
in C. Mit entsprechend komplexen Konstruktoren. Und ein bisschen Magie. Und im Grunde ist es dem Compiler überlassen, zu entscheiden, wie er das genau macht. Und Ableitung ist in C eh etwas sehr kompliziert, aber ein C++-nach-C-Compiler könnte in etwa solchen Code rausschmeißen.
Der Effekt den das hat, ist, dass beim Aufrufen virtueller Funktionen von Zeigern und Referenzen vom Typ einer Basisklasse des eigentlichen Objekts die vtbl trotzdem den Zeiger auf die Funktion des eigentlichen Objekts zeigt, und dementsprechend auch die aufgerufen wird. Für normale Objekte ist das prinzipiell auch der Fall, aber da hat das Symbol auch den Typ des eigentlichen Objekts, und die ganze Diskussion ist eh hinfällig. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra |