2010-07-23 13 views

Antwort

11

Mit Vorlage Ente-Typisierung, Sie tun statische Polymorphie. So können Sie nicht Dinge wie

std::vector<bird*> birds; 
birds.push_back(new duck()); 

Da Sie jedoch auf der Kompilierung Typisierung angewiesen sind, sind Sie ein wenig effizienter (kein virtueller Aufruf keine dynamischen Dispatch (Basis auf dem dynamischen Typ impliziert)).

+2

Ihre 'Vögel' unterliegen dem Slicing, verwenden Sie stattdessen Zeiger. –

+3

@ Scharron. Virtuelle Aufrufe verursachen keine "dynamische Typprüfung" oder etwas Ähnliches. C++ führt zur Laufzeit keine Typprüfung durch. – John

+0

@Georg Ich verstehe deinen Kommentar nicht wirklich. Selbst mit Zeigern wird der Code nicht funktionieren, das Schneiden ist nicht verwandt. –

2

Wenn die "Vorlagennatur" der Dinge weit verbreitet ist, ist es in Ordnung, Schablonen ("kompilieren-Zeit-Eingabe") können Sie blitzschnell Geschwindigkeit (Vermeidung der "Ebene der Indirektion", die implizit in einer virtuellen Funktion ist Call) obwohl vielleicht einige Kosten im Speicher Fußabdruck (in der Theorie, gute C++ Implementierungen könnte vermeiden, dass Speicher Overhead im Zusammenhang mit Vorlagen, aber ich fühle mich nicht sehr zuversichtlich, dass solche qualitativ hochwertige Compiler wird unbedingt auf allen Plattformen zur Verfügung stehen du musst portieren ;-). Also, zumindest pragmatisch, ist es ein Kompromiss aus Geschwindigkeit und Speicher. Wenn die Vorgänge, die Sie gerade ausführen, so extrem langsam sind wie I/O, dann ist der relativ kleine Geschwindigkeitsgewinn durch das Vermeiden eines virtuellen Anrufs nicht wirklich wichtig für Ihren Anwendungsfall.

0

Sie sind zwei völlig verschiedene Dinge. Man ist keine Alternative zum anderen. Die Template-Funktion bietet eine allgemeine Operation somefunc(), die für eine ganze Klasse von Typen gilt, nicht nur für Vögel. Der Typ seines Parameters muss zur Kompilierungszeit bekannt sein. Die virtuelle Methode stellt eine polymorphe Laufzeitoperation bereit, die für Vögel spezifisch ist. Der genaue Typ des Parameters (this) muss zur Kompilierungszeit nicht bekannt sein.

Da sie unterschiedliche Funktionalität bieten und nicht miteinander in Konflikt stehen, ist es selten, dass Sie sich jemals zwischen den beiden Ansätzen entscheiden müssen. Entscheiden Sie, welche Funktionalität Sie benötigen, und der sinnvolle Ansatz wird offensichtlich sein. Es kann sogar eine Kombination aus beidem sein.

(btw, der Begriff "Duck Typing" hier missbraucht wird. Weder Ansatz ist Ente eingeben. Sie sollten den Satz aus Ihrem C++ Lexikon fallen.)

+5

Ich stimme Ihrer Antwort in vielen Punkten nicht zu. Vorlagen können auf viele Arten in C++ verwendet werden, einer davon ist effektiv Duck-Typing, und Sie sollten sich besser darüber informieren. Zweitens stimme ich auch dem Teil "Entscheide, welche Funktionalität du benötigst, und der vernünftige Ansatz wird offensichtlich sein". Programmierung ist nicht immer geradlinig und Design-Entscheidungen sind nicht immer offensichtlich. –

2

Compile Zeit vs. Runtime. Wenn Sie die Kompilierzeit binden möchten, müssen Sie Vorlagen verwenden. Wenn Sie die Typen zum Zeitpunkt der Kompilierung nicht kennen, sollten Sie die virtuelle Vererbung verwenden.

+0

Schöne und kurze Antwort. Es sagt alles, was ein intermediärer Programmierer wissen muss, um zu entscheiden, welchen Weg er wählen soll (sobald er weiß, wann er seine Typen dynamisch machen muss, wie zum Beispiel in einem Container des abstrakten Typs). Ich frage mich, warum das seit fast drei Jahren nicht aufgewertet wurde. Jetzt hat es :) – leemes

-2

@ John ist richtig. Wenn Sie zwei Parameter des Kovariantentyps haben, haben Sie keine Wahl, Sie müssen Vorlagen verwenden. Objektorientierte Techniken bieten Laufzeitversand, sind jedoch nur für Typen verfügbar, deren Methoden höchstens ein variantes Argument (das Objekt) haben.

Bei den meisten interessanten Problemen handelt es sich um N-artige Beziehungen mit N> 1, daher haben Sie normalerweise keine andere Wahl, als Vorlagen zu verwenden. Überprüfen Sie die Standardbibliothek, um zu sehen, welche Technik am häufigsten verwendet wird.

Verwandte Themen