Statische Typprüfung bedeutet, dass die Typprüfung zum Zeitpunkt der Kompilierung erfolgt. In diesem Fall wird keine Typinformation zur Laufzeit verwendet.
Die dynamische Typprüfung tritt auf, wenn Typinformationen zur Laufzeit verwendet werden. C ++ verwendet einen Mechanismus namens RTTI (Laufzeittypinformationen), um dies zu implementieren. Das gebräuchlichste Beispiel für die Verwendung von RTTI ist der dynamic_cast-Operator, der das Deklinieren von polymorphen Typen erlaubt:
%Vor%Außerdem können Sie den Typid-Operator verwenden, um sich über den Laufzeittyp von Objekten zu informieren. Sie können damit beispielsweise prüfen, ob die Form im Beispiel ein Kreis oder ein Rechteck ist. Hier sind einige weitere Informationen .
C ++ hat sehr wenig Unterstützung für die dynamische Typprüfung durch dynamic_cast und andere sind durch typ id . Beide können nur verwendet werden, wenn die RTTI-Unterstützung im Compiler aktiviert ist.
%Vor%Das Schlüsselwort dynamic_cast setzt ein Datum von einem Zeiger oder Referenztyp auf einen anderen um und führt eine Laufzeitprüfung durch, um die Gültigkeit des Cast sicherzustellen.
Wenn Sie versuchen, einen Zeiger auf einen Typ zu setzen, der kein Typ eines tatsächlichen Objekts ist, ist das Ergebnis der Umwandlung NULL. Wenn Sie versuchen, auf einen Typ zu verweisen, der kein Typ eines tatsächlichen Objekts ist, löst der Cast eine bad_cast-Ausnahme aus.
Stellen Sie sicher, dass in der Basisklasse mindestens eine virtuelle Funktion vorhanden ist, damit dynamicast funktioniert.
%Vor%In C ++ gibt es mehrere Arten von Umwandlungen.
Am gebräuchlichsten wäre es, static_cast zu verwenden Wirf eine Variable von einem Zeigertyp auf einen anderen. Sie können jedoch auch dynamic_cast verwenden, um sicherzustellen, dass dies überprüft wird (zur Laufzeit), dass die Zeiger vom richtigen Typ sind. Wenn der Zeiger bei dynamic_cast nicht vom richtigen Typ ist, gibt er zur Laufzeit 0 zurück.
%Vor%Angenommen, Sie haben:
%Vor%Für den statischen Typ sehen Sie, wie die Variable deklariert wird.
%Vor% Also ist der statische Typ von a
A*
(oder anders gesagt, der statische Typ von *a
ist A
).
Und der statische Typ von b
ist B*
(oder anders gesagt, der statische Typ von *b
ist B
).
Beachten Sie, dass a
und b
einen statischen Typ haben, der durch seine Deklaration festgelegt wird - es spielt keine Rolle, was Sie in sie eingeben, sie behalten den gleichen statischen Typ bei. ("Statisch" bedeutet "unveränderlich").
Für den dynamischen Typ sehen Sie, was gerade in der Variablen passiert.
%Vor% Die dynamischen Typen von a
und b
sind also beide B*
(oder anders gesagt, die dynamischen Typen von *a
und *b
sind beide B
).
Beachten Sie, dass sich der dynamische Typ ändern kann - wenn Sie a = new A()
hatten, wurde der dynamische Typ von a
gerade in A*
geändert. Manchmal wissen Sie nicht, was der dynamische Typ ist - z. Wenn Sie a = somefunc()
haben, dann könnte a
den dynamischen Typ A*
, B*
oder sogar C*
haben (wenn ein Code, den Sie nicht gesehen haben, definiert C
als Unterklasse von A
oder B
).
Wenn A
eine virtual
-Methode hatte, könnten Sie dynamic_cast
verwenden, um herauszufinden, was der dynamische Typ ist. (Normalerweise, wenn Sie diese Art von Code verwenden, möchten Sie delete a
; damit das funktioniert A
destruktor muss virtual
sein. Und macht A
's destructor virtual reicht aus, damit dynamic_cast
funktioniert).
Statische Typprüfung ist eine Typprüfung, die zur Kompilierzeit durchgeführt wird. Dies ist der einzige Typ von Typ, der C ++ überprüft. Bei der dynamischen Typprüfung wird zur Laufzeit eine Typprüfung durchgeführt. Dies wird normalerweise in dynamisch interpretierten Sprachen gesehen, ist aber in kompilierten Sprachen weniger verbreitet. Zuletzt habe ich überprüft, dass C ++ keine dynamische Typüberprüfung durchführt.
Edit: Anscheinend bin ich veraltet. Siehe Reeds Kommentar unten.
Tags und Links c++