Frage

Und warum wir nicht die gleiche Methode für nicht virtuelle Funktionen verwenden?

Ich meine, warum tun wir virtuelle Funktionen auf diese Weise verwenden? Können wir sie nicht benutzen Sie einfach als nicht-virtaul Einsen und überschreiben sie?

Und wenn diese Methode spart uns Zeit / Raum oder was auch immer, warum wir nicht die gleiche Methode für nicht-virtuelle Funktionen nutzen? Ich meine, es würde Sinn machen, dass es eine Tabelle der Funktionen für eine bestimmte Klasse sein würde.

Wie auch immer, danke im voraus, ich bin nur ein bisschen verwirrt.

War es hilfreich?

Lösung

Sie können nicht Laufzeit-Polymorphismus haben, ohne einen Dereferenzierungsebene zu verwenden. Das ist, was die vptr ist.

Die vptr ist nicht für die Nicht-polymorphe Funktionen verwendet, weil das indirection etwas kostet. Die C ++ Philosophie ist, dass Sie nicht zahlen für das, was Sie nicht verwenden.

EDIT:

Hier einige Informationen darüber, wie virtuelle Tabellen Arbeit: http://en.wikipedia.org/wiki/Virtual_table

Andere Tipps

Der Compiler erzeugt im Wesentlichen einen direkten Aufruf an nicht-virtuellen Methoden. Mit einem virtuellen Methodenaufruf erzeugt der Compiler Code die Adresse des Verfahrens zum Nachschlagen und macht dann einen Anruf an diese Adresse. So ist es in der Theorie zumindest eine weitere Lookup, wenn eine virtuelle Funktion aufrufen. Es gäbe keinen Grund, diese Kosten zu verursachen sonst.

vptr verwenden, können Auflösungsverfahren auf Basis von Objekttyp anstatt Variablentyp. Nicht vptr Verwendung macht Methodenaufrufe schneller. Die C ++ Designer entschieden, der Bequemlichkeit der virtuellen Funktionen zu ermöglichen, aber nicht erfordert die Leistungseinbuße für andere Funktionen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top