Was ich denke ist, dass dynamischer Typ dynamisch zugewiesenes Objekt mit new
bedeutet. Sagen Sie im folgenden Fall p
Punkte auf den dynamischen Typ oder den statischen Objekttyp? Im Standard heißt es nicht, dass der dynamische Typ ein dynamisches Objekt ist.
1.3.3 - Der Typ des am meisten abgeleiteten Objekts (1.8), auf das der lvalue verweist durch einen lvalue Ausdruck bezieht sich. [Beispiel: wenn ein Zeiger (8.3.1) p dessen Der statische Typ ist "Zeiger auf Klasse B" verweist auf ein Objekt der Klasse D, abgeleitet von B (Abschnitt 10), der dynamische Typ des Ausdrucks * p ist "D." Referenzen (8.3.2) werden ähnlich behandelt. ]
Auch was bedeutet das folgende Zitat
%Vor%Der dynamische Typ eines rvalue-Ausdrucks ist der statische Typ
Was ich denke ist, dass dynamischer Typ dynamisch zugewiesenes Objekt bedeutet mit neuen.
Nein.
Der dynamische Typ ist der reale Typ eines Objekts, auf das über eine Referenz (inklusive Pointer) zugegriffen werden kann, die auf einen Basistyp seines realen Typs zeigt.
Das heißt, wenn wir:
%Vor%Hier ist k eine Referenz auf ein Objekt vom Typ A, aber der reelle Typ des referenzierten Objekts, sein dynamischer Typ, ist B.
Hier hat "dynamisch" die Bedeutung "nur zur Laufzeit bekannt".
Der statische Typ ist der Typ der Variablen, der einzige Typ, der bei der Kompilierzeit bekannt ist (daher als statisch betrachtet - kann nicht geändert werden). Der dynamische Typ ist der Typ des Objekts, auf das tatsächlich Laufzeit verwiesen wird. Dynamisch bedeutet hier, dass es nur zur Laufzeit bekannt ist, was bedeutet, dass es sich ändern kann (dh eine Variable kann auf verschiedene Objekte verschiedener Typen zeigen).
Die Verwendung von new
in diesem Inhalt ist nicht relevant, wie Ihr eigenes Beispiel zeigt. In Ihrem main ist der statische und dynamische Typ von d
Derived
, weil es kein Zeiger oder Verweis ist. p
hat jedoch den statischen Typ Base
, aber in Ihrem Code wäre der dynamische Typ Derived
.
In einer statisch typisierten Sprache, wie zB C ++ oder Java, kann sich static
auf die zur Kompilierungszeit bekannten Informationen beziehen, während dynamic
sich auf die zur Laufzeit bekannten Informationen bezieht.
Zum Beispiel:
%Vor% In der Methode print
ist der static
-Typ von b
Base const&
. Daher überprüft der Compiler, ob alle aufgerufenen Methoden im Kontext eines Base
-Objekts existieren.
Wenn jedoch die Ausführung erfolgt, wird der Aufruf von name
, da die Methode virtuell ist, in Bezug auf den dynamic
-Typ des Objekts ausgeführt:
Base
sein
Derived
sein
Base
sein, die wir noch nicht kennen Daher im folgenden Beispiel:
%Vor%static
und dynamic
Typ von base
ist Base
und derived
ist Derived
. print
ist der static
-Typ von b
Base
(immer) dynamic
von b
entweder Base
oder Derived
Es ist ein aktueller Fehler anzunehmen, dass Polymorphismus notwendigerweise auf dynamischer Speicherzuweisung basiert, aber die beiden Konzepte, obwohl nicht orthogonal, können unter einigen Bedingungen ohne einander verwendet werden.
Die dynamische Speicherzuweisung erfolgt immer zur Laufzeit. Sie kann mit dem Schlüsselwort "new" erreicht werden. aber es gibt einen weiteren Fall, wie in Ihrem Problem * p = & amp; d erwähnt, da Sie die Basisklassenfunktion "Virtuell" gemacht haben, teilt der Compiler dem "p" den Inhalt und nicht den Typ des Zeigers mit, zu dem er gehört .so ist dies eine der dynamischen Speicherzuweisung, da der Compiler nie weiß, welche Adresse des Klassenobjekts zur Laufzeit gespeichert werden soll, sondern nur, um welchen Typ von Zeiger es sich handelt (dh Basisklassenzeiger oder abgeleiteten Klassenzeiger).
Tags und Links c++ inheritance