Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » warum nicht immer virtual?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 <
010
11.10.2007, 20:37 Uhr
mike
Pinguinhüpfer
(Operator)


Hmm. Imo ist das wesentliche:
* ohne virtual: es ist zur Kompilierzeit bekannt
* mit virtual: es ist erst zur Laufzeit bekannt was ich an "Objekt" bekomme

Aber den Zusammenhang Zeiger, direkte Objektzugriff kann ich nicht erkennen
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
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
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: