Zeitpolymorphismus und Laufzeitpolymorphismus kompilieren

7

Ich habe bemerkt, dass irgendwo Polymorphie sich nur auf die virtuelle Funktion bezieht. Irgendwo enthalten sie jedoch die Funktion Überladung und Vorlage. Später fand ich zwei Begriffe, den Kompilierungszeitpolymorphismus und den Laufzeitpolymorphismus. Ist das wahr?

Meine Frage ist, wann wir allgemein über Polymorphismus gesprochen haben, was ist die allgemein akzeptierte Bedeutung?

    
skydoor 24.01.2010, 21:05
quelle

8 Antworten

13

Ja, Sie haben recht, in C ++ gibt es zwei anerkannte "Arten" von Polymorphie. Und sie meinen ziemlich genau, was du denkst, was sie meinen.

Dynamischer Polymorphismus

ist, was C # / Java / OOP-Leute typischerweise einfach als "Polymorphismus" bezeichnen. Es handelt sich im Wesentlichen um Unterklassen, die entweder von einer Basisklasse abgeleitet werden und eine oder mehrere virtuelle Funktionen überschreiben oder eine Schnittstelle implementieren. (was in C ++ durch Überschreiben der virtuellen Funktionen geschieht, die zur abstrakten Basisklasse gehören)

Statischer Polymorphismus

findet zur Kompilierzeit statt und könnte als eine Variante des Ducktyps betrachtet werden. Die Idee hier ist einfach, dass verschiedene Typen in einer Funktion verwendet werden können, um das gleiche Konzept darzustellen, obwohl sie völlig unabhängig sind. Betrachten Sie für ein sehr einfaches Beispiel dies

%Vor%

Wenn dies ein dynamischer Polymorphismus gewesen wäre, würden wir die Funktion add definieren, um eine Art "IAddable" Objekt als Argumente zu nehmen. Jedes Objekt, das diese Schnittstelle implementiert (oder von dieser Basisklasse ableitet), kann trotz ihrer unterschiedlichen Implementierungen verwendet werden, was uns das polymorphe Verhalten gibt. Es ist uns egal, welcher Typ an uns übergeben wird, solange er eine Art "zusammensetzbare" Schnittstelle implementiert. Der Compiler weiß jedoch nicht , welcher Typ an die Funktion übergeben wird. Der genaue Typ ist nur zur Laufzeit bekannt, daher ist dies dynamischer Polymorphismus.

Hier müssen Sie jedoch nicht von irgendetwas ableiten, der Typ T muss nur den Operator + definieren. Es wird dann statisch eingefügt. Also können wir bei der Kompilierung zwischen jedem gültigen Typ wechseln, solange sie sich gleich verhalten (was bedeutet, dass sie die Mitglieder definieren, die wir brauchen)

Dies ist eine andere Form des Polymorphismus. Der Effekt ist im Prinzip derselbe: Die Funktion arbeitet mit jeder Implementierung des Konzepts, an dem wir interessiert sind. Es ist uns egal, ob das Objekt, an dem wir arbeiten, ein String, ein Int, ein Float oder eine komplexe Zahl ist solange es das Konzept "Kann hinzugefügt werden" implementiert .

Da der verwendete Typ statisch (zur Kompilierungszeit) bekannt ist, wird dies als statischer Polymorphismus bezeichnet. Und die Art und Weise, wie ein statischer Polymorphismus erreicht wird, ist durch Vorlagen und Überladen von Funktionen.

Wenn jedoch ein C ++ - Programmierer nur Polymorphismus sagt, beziehen sie sich im Allgemeinen auf den dynamischen / Laufzeit-Polymorphismus.

(Beachten Sie, dass dies nicht unbedingt für alle Sprachen gilt. Ein funktionaler Programmierer wird normalerweise so etwas wie statischen Polymorphismus meinen, wenn er den Begriff verwendet - die Fähigkeit, generische Funktionen mit einer Art von parametrisierten Typen zu definieren, ähnlich wie Vorlagen)

    
jalf 24.01.2010, 21:32
quelle
8

"Polymorphismus" bedeutet wörtlich "viele Formen". Der Begriff ist in der Informatik leider etwas überladen (entschuldige das Wortspiel).

Laut FOLDOC ist Polymorphismus "ein Konzept, das zuerst von Christopher Strachey (1967) identifiziert und von Hindley und Milner entwickelt wurde, um Typen wie z als Liste von irgendetwas. "

Im Allgemeinen ist es "ein Programmiersprachen-Feature, das es erlaubt, Werte verschiedener Datentypen mit einer einheitlichen Oberfläche zu behandeln", um zu zitieren Wikipedia , die zwei Haupttypen von Polymorphismen beschreibt:

Parametrische Polymorphie ist, wenn der gleiche Code auf mehrere Datentypen angewendet werden kann. Die meisten Menschen in der objektorientierten Programmiergemeinschaft bezeichnen dies als "generische Programmierung" und nicht als Polymorphismus. Generika (und teilweise Vorlagen) passen in diese Kategorie.

Ad-hoc Polymorphismus ist, wenn anderer Code für verschiedene Datentypen verwendet wird. Überladen fällt ebenso in diese Kategorie wie Übersteuern. Darauf beziehen sich die Menschen in der objektorientierten Gemeinschaft allgemein, wenn sie "Polymorphismus" sagen. (und in der Tat, viele bedeuten Übersteuern, nicht überladen, wenn sie den Begriff "Polymorphismus" verwenden)

Bei Ad-hoc-Polymorphismen stellt sich auch die Frage, ob die Auflösung des Implementierungscodes zur Laufzeit (dynamisch) oder zur Kompilierungszeit (statisch) erfolgt. Das Überladen von Methoden ist im Allgemeinen statisch und das Überschreiben von Methoden ist dynamisch. Hier kommen die Begriffe statischer / kompilierbarer Polymorphismus und dynamischer / Laufzeitpolymorphismus her.

    
Laurence Gonsalves 24.01.2010 21:57
quelle
5

Normalerweise beziehen sich Leute auf Laufzeit-Polymorphismus nach meiner Erfahrung ...

    
Goz 24.01.2010 21:09
quelle
5

Wenn ein C ++ - Programmierer "Polymorphismus" sagt, meint er höchstwahrscheinlich Subtyp-Polymorphismus, was "späte Bindung" oder "dynamische Bindung" mit virtuellen Funktionen bedeutet. Funktionsüberladung und generische Programmierung sind beide Instanzen von Polymorphie und beinhalten statische Bindung zur Kompilierungszeit, so dass sie kollektiv als kompilierbarer Polymorphismus bezeichnet werden können. Der Subtyp-Polymorphismus wird fast immer nur als Polymorphismus bezeichnet, aber der Begriff könnte sich auch auf alle oben genannten beziehen.

    
Eric Mickelsen 24.01.2010 21:37
quelle
3

In seiner prägnantesten Form bedeutet Polymorphie die Fähigkeit eines Typs, so zu erscheinen, als wäre er ein anderer Typ.

Es gibt zwei Haupttypen von Polymorphismen.

  1. Subtyp-Polymorphismus: Wenn D von B abgeleitet wird, dann ist D ein B .
  2. Interface polymorphism: wenn C eine Schnittstelle implementiert I .

Das erste ist, was Sie als Laufzeitpolymorphie denken. Die zweite trifft nicht wirklich auf C ++ zu und ist wirklich ein Konzept, das für Java und C # gilt.

Manche Leute halten das Überladen im Spezialfall der Operatoren ( + , - , / , * ) für eine Art von Polymorphismus, weil sie an Typen denken können, die diese Operatoren überladen haben als austauschbar für einander (zB + für string und + für int ). Dieses Konzept der Polymorphie gilt am häufigsten für dynamische Sprachen. Ich halte dies für einen Missbrauch der Terminologie.

Wie bei der Template-Programmierung werden Sie sehen, dass einige den Begriff "Polymorphismus" verwenden, aber das ist wirklich eine ganz andere Sache als das, was wir normalerweise mit Polymorphismus meinen. Ein besserer Name für dieses Konzept ist "generische Programmierung" oder "Generizität".

    
jason 24.01.2010 21:17
quelle
1

Verschiedene Arten des Überladens von Funktionen (Kompilierzeit-Polymorphismus ... 9 Jun 2011 ... Polymorphismus bedeutet, dass sich dieselbe Entität zu unterschiedlichen Zeiten anders verhält. Der Kompilierzeitpolymorphismus wird auch als statische Bindung bezeichnet. Ссылка

    
rag 10.06.2011 00:05
quelle
1

Eine einfache Erklärung zum Kompilierzeitpolymorphismus und Laufzeitpolymorphismus von: questionscompiled.com

Kompilierzeit Polymorphismus:

C ++ unterstützt Polymorphie. Eine Funktion mehrere Zwecke, oder kurz viele Funktionen mit dem gleichen Namen, aber mit unterschiedlichen Funktionskörper. Für jeden Funktionsaufruf bindet der Compiler den Aufruf zur Kompilierungszeit an eine Funktionsdefinition. Diese Entscheidung der Bindung zwischen mehreren Funktionen wird getroffen, indem formale Argumente der Funktion, ihr Datentyp und ihre Reihenfolge berücksichtigt werden.

Laufzeitpolymorphie:

C ++ ermöglicht die Verzögerung der Bindung bis zur Laufzeit. Wenn Sie eine Funktion mit demselben Namen, der gleichen Anzahl von Argumenten und demselben Datentyp in derselben Reihenfolge in der Basisklasse wie die abgeleitete Klasse und einen Funktionsaufruf in der Form haben: base_class_type_ptr- & gt; member_function (args); wird immer Base-Member-Funktion aufrufen. Das Schlüsselwort virtual für eine Elementfunktion in der Basisklasse gibt dem Compiler an, die Bindung bis zur Laufzeit zu verzögern.

Jede Klasse mit mindestens einer virtuellen Funktion hat eine vtable, die beim Binden zur Laufzeit hilft. Mit Blick auf den Inhalt des Basisklassen-Typ-Zeigers wird er die Elementfunktion einer der möglichen abgeleiteten / Basisklassen-Elementfunktionen korrekt aufrufen.

    
bitdeveloper 18.02.2013 19:34
quelle
0

Ja, Sie haben grundsätzlich recht. Kompilierzeit-Polymorphie ist die Verwendung von Templates (Instanzen deren Typen variieren, sind aber zur Kompilierzeit festgelegt). Laufzeit-Polymorphie bezieht sich auf die Verwendung von Vererbung und virtuellen Funktionen (Instanzen deren Typen variieren und werden zur Laufzeit festgelegt) .

    
anon 24.01.2010 21:23
quelle

Tags und Links