compile-Zeit-Polymorphismus und Laufzeit-Polymorphismus
Bemerkte ich, dass irgendwo Polymorphismus einfach finden Sie virtuelle Funktion. Aber irgendwo dazu gehören die Funktion überladen und eine Vorlage. Später habe ich herausgefunden, dass es zwei Begriffe, compile-Zeit-Polymorphismus und Laufzeit-Polymorphie. Ist das wahr?
Meine Frage ist, wenn wir Sprachen über Polymorphismus in der Regel, was ist die weithin akzeptierte Bedeutung?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, du hast Recht, in C++ gibt es zwei anerkannte "Arten" von Polymorphismus. Und Sie meinen ziemlich viel, was Sie denken, Sie bedeuten
Dynamischen Polymorphismus
ist das, was C# - /Java - /OOP-Menschen finden Sie in der Regel einfach als "Polymorphismus". Es ist im wesentlichen das erstellen von Unterklassen, entweder die Ableitung von einer Basis-Klasse und überschreiben Sie eine oder mehr virtuelle Funktionen oder die Implementierung einer Schnittstelle. (die in C++ erfolgt durch überschreiben der virtuellen Funktionen gehören zu den abstrakten Basis-Klasse)
Statischen Polymorphismus
erfolgt zur compile-Zeit, und könnte als eine Variante von ducktyping. Die Idee hier ist einfach, dass verschiedene Arten verwendet werden kann, in einer Funktion, die das gleiche Konzept darstellen, obwohl Sie völlig unabhängig voneinander sind. Für ein sehr einfaches Beispiel, betrachten Sie dieses
Wenn dies wurde auf dynamische Polymorphie, dann würden wir definieren die
add
Funktion zu nutzen, eine Art "IAddable" - Objekt als Argumente. Jedes Objekt, das implementieren dieser Schnittstelle (oder eine Ableitung dieser Basisklasse) kann verwendet werden, trotz Ihrer unterschiedlichen Implementierungen gibt, die uns das polymorphe Verhalten. Wir kümmern uns nicht, der Typ ist an uns weitergegeben, so lange wie es implementiert eine Art "Hinzugefügt werden können-zusammen" - Schnittstelle.Der compiler hat aber nicht wirklich wissen welche Art ist an die Funktion übergeben. Der genaue Typ erst zur Laufzeit bekannt ist, daher ist dies dynamische Polymorphismus.
Hier, obwohl wir nicht verlangen, dass Sie eine Ableitung von etwas, der Typ
T
nur zu definieren, die+
Betreiber. Es wird dann eingefügt statisch. Also zur compile-Zeit, wir können Umschalten zwischen jeder gültige Typ, solange Sie Verhalten das gleiche (bedeutet, dass Sie definieren die Mitglieder, die wir brauchen)Dies ist eine andere form von Polymorphismus. Im Prinzip, der Effekt ist der gleiche: Die Funktion funktioniert mit jeder Anwendung des Konzepts der uns interessiert. Wir kümmern uns nicht, wenn das Objekt, wir arbeiten auf eine Zeichenfolge, die einen int, einen float oder eine komplexe Zahl ist, solange es implementiert das "Hinzugefügt werden kann, zusammen" Konzept.
Da der Typ bekannt ist statisch (zur Compilezeit), dies ist bekannt als statische Polymorphie. Und die Art und Weise statische Polymorphie erreicht wird, ist durch die Vorlagen und das überladen von Funktionen.
Jedoch, wenn ein C++ - Programmierer nur sagen, Polymorphismus, Sie beziehen sich im Allgemeinen auf dynamische/Laufzeit-Polymorphismus.
(Beachten Sie, dass dies nicht unbedingt für alle Sprachen. Eine funktionale Programmierer wird in der Regel bedeuten, so etwas wie statische Polymorphie, wenn er verwendet den Begriff -- das definieren von generischen Funktionen, die mit irgendeiner Art von parametrisierten Typen, ähnlich den Vorlagen)
"Polymorphismus" bedeutet wörtlich "viele Formen". Der Begriff ist leider etwas überladen in computer science (entschuldigen Sie das Wortspiel).
Laut FOLDOC, Polymorphismus ist "ein Konzept, das erstmals identifiziert von Christopher Strachey (1967) und entwickelt von Hindley und Milner, so dass Typen wie Liste von nichts."
Im Allgemeinen, es ist "eine Programmier-Sprache Funktion, die es erlaubt Werte von verschiedenen Arten von Daten behandelt werden, mit einem einheitlichen interface", zu zitieren,Wikipedia, das geht zu beschreiben zwei Arten von Polymorphie:
Parametric Polymorphismus ist, wenn die gleichen code kann angewendet werden, um mehrere Datentypen. Die meisten Menschen in der Objekt-orientierten Programmierung-community bezeichnen dies als "generische Programmierung", sondern als Polymorphismus. Generika (und zum Teil Vorlagen) passen in diese Kategorie.
Ad-hoc - Polymorphismus ist, wenn verschiedenen code - wird für verschiedene Daten-Typen. Überlastung fällt in diese Kategorie, wie auch überschreiben. Dies ist, was die Menschen in der Objekt-orientierten community sind in der Regel meinen, wenn Sie sagen, "Polymorphismus". (und in der Tat, viele meinen überschreiben, nicht überladen, wenn Sie den Begriff "Polymorphismus")
Für ad-hoc-Polymorphismus es ist auch die Frage, ob die Auflösung der code zur Implementierung geschieht zur Laufzeit (dynamisch) oder compile-Zeit (statisch). Die Methode überladen ist im Allgemeinen statisch und zwingende Methode ist dynamisch. Dies ist, wo die Bedingungen static/compile-Zeit-Polymorphismus und dynamische/Laufzeit-Polymorphie kommen.
In der Regel Leute beziehen sich auf run-time-polymorpism in meiner Erfahrung ...
Wenn ein C++ - Programmierer sagt "Polymorphismus" er bedeutet höchstwahrscheinlich Subtyp-Polymorphismus, was bedeutet, "späte Bindung" oder "dynamische Bindung" mit virtuellen Funktionen. Das überladen von Funktionen und generische Programmierung sind die beiden Instanzen des Polymorphismus und Sie dazu veranlassen, statische Bindung zur compile-Zeit, so dass Sie werden zusammenfassend als compile-Zeit-Polymorphismus. Subtyp-Polymorphismus ist fast immer nach nur als Polymorphismus, aber der Begriff könnte auch verweisen Sie auf alle der oben genannten.
In seine prägnanteste form, Polymorphie bezeichnet man die Fähigkeit einer Art zu erscheinen, als wenn es ein anderer Typ.
Gibt es zwei Arten von Polymorphismus.
D
stammt ausB
dannD
ist einB
.C
implementiert eine SchnittstelleI
.Das erste ist, was Sie denken als Laufzeit-Polymorphismus. Der zweite nicht wirklich zu C++ und ist ein wirklich ein Konzept, das gilt für Java und C#.
Einige Leute denken, überlastung im speziellen Fall von Unternehmen (
+
,-
,/
,*
) als eine Art von Polymorphismus, weil es Ihnen erlaubt zu denken, Typen, die überladene Operatoren mit diesen Operatoren als austauschbar für jedes andere (d.h.,+
fürstring
und+
fürint
). Das Konzept des Polymorphismus am häufigsten gilt für dynamische Sprachen. Ich halte das für einen Missbrauch der Terminologie.Als Vorlage für die Programmierung, Sie werden sehen, einige verwenden den Begriff "Polymorphismus" das ist aber wirklich eine ganz andere Sache als das, was wir in der Regel durch bedeutet Polymorphismus. Ein besserer name für dieses Konzept ist "generische Programmierung" oder "genericity."
Verschiedene Arten von überladen von Funktionen (compile-Zeit-Polymorphismus ...
9 Jun 2011 ... Polymorphismus bedeutet, dass dieselbe Person verhält sich zu unterschiedlichen Zeiten unterschiedlich. Compile-Zeit-Polymorphismus wird auch als statische Bindung.
http://churmura.com/technology/programming/various-types-of-function-overloading-compile-time-polymorphism-static-binding/39886/
Eine einfache Erklärung auf compile-Zeit-Polymorphismus und Laufzeit-Polymorphismus aus :
questionscompiled.com
Compile-Zeit-Polymorphismus:
C++ unterstützt Polymorphie. Eine Funktion mehrere Zweck, oder kurz gesagt viele Funktionen mit gleichen Namen, aber mit unterschiedlicher Funktion Körper.
Für jeden Funktionsaufruf compiler bindet der Aufruf einer Funktion definition zur compile-Zeit. Dies ist eine Entscheidung, die Bindung zwischen den verschiedenen Funktionen erfolgt durch Berücksichtigung der formalen Argumente der Funktion, die Ihrem Datentyp und Ihrer Reihenfolge.
Laufzeit-Polymorphismus:
C++ ermöglicht die Bindung an verzögert werden, bis der Laufzeit. Wenn Sie eine Funktion mit dem gleichen Namen, die gleiche Anzahl von Argumenten und den gleichen Datentyp in der gleichen Reihenfolge in die Basis-Klasse als auch der abgeleiteten Klasse und einen Funktionsaufruf der form: base_class_type_ptr->member_function(args); wird immer call base class-member-Funktion. Das Schlüsselwort virtual auf eine member-Funktion in der Basis-Klasse weist den compiler an, die Verzögerung der Bindung bis Laufzeit.
Jede Klasse mit mindestens einer virtuellen Funktion hat eine vtable, hilft bei der Bindung zur Laufzeit. Blick auf die Inhalte des Basis-Klasse Typ Zeiger es wird richtig Aufruf der member-Funktion einer der möglichen abgeleitet /base class-member-Funktion.
Ja, sind Sie im Grunde Recht. Compile-Zeit-Polymorphismus ist die Verwendung von Vorlagen (von denen Instanzen der Typen variieren, aber Sie sind fest zur compile-Zeit) während der run-time-Polymorphie bezieht sich auf die Verwendung von Vererbung und virtuellen Funktionen (von denen Instanzen der Typen variieren und sind Fix bei der Laufzeit).