Was ist ein dynamischer Objekttyp?

8

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

  

Der dynamische Typ eines rvalue-Ausdrucks ist der statische Typ

%Vor%     
user103214 04.10.2011, 14:40
quelle

4 Antworten

20
  

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".

    
Klaim 04.10.2011, 14:45
quelle
5

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 .

    
eran 04.10.2011 14:44
quelle
3

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:

  • Dies kann Base sein
  • Dies kann Derived sein
  • Dies kann eine andere abgeleitete Klasse von Base sein, die wir noch nicht kennen

Daher im folgenden Beispiel:

%Vor%
  • Der static und dynamic Typ von base ist Base und derived ist Derived .
  • In der Methode print ist der static -Typ von b Base (immer)
  • Abhängig von der Anzahl der Argumente ist 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.

    
Matthieu M. 04.10.2011 15:13
quelle
-1

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).

    
aj8080 04.10.2011 15:31
quelle

Tags und Links