2016-06-20 5 views
-1

sagen, dass ich die Klassenhierarchie haben:In C++ 11 gibt eine fehlgeschlagene dynamic_cast NULL oder Std :: nullptr zurück?

class Base{ 
} 

class Derived : public Base{ 

} 

Angenommen, ich möchte überprüfen, ob ein Objekt vom Typ abgeleitet wird oder nicht:

Base* b = new Base(); 
Derived* d = dynamic_cast<Derived*>(b); 
if(b!=nullptr){ //Should this check be for 0, NULL or nullptr ? 
// b is not Derived 
} 

Soll ich für 0, NULL oder nullptr in C Testen werden ++ 11?

eine Antwort gefunden: (Leider hat es nicht angezeigt, wenn ich über google gesucht) In c++11, does dynamic_cast return nullptr or 0?

+1

Unabhängig davon sollten Sie für 'nullptr' testen, um den Lesern des Codes am klarsten zu kommunizieren, was das Programmieren in einer Sprache über dem numerischen Maschinencode ist. –

+1

Ein fehlgeschlagener 'dynamic_cast ' gibt 0, NULL oder nullptr nicht zurück. Es gibt eine Null 'Base * 'zurück. Aber das ist irrelevant für die Frage, mit welchem ​​der 3 Sie es vergleichen sollten. –

+0

@BenjaminLindley Warum überprüfen dann einige Leute beim Testen, ob ein dynamic_cast funktioniert? –

Antwort

3
C 11 ++ §5.2.7/9:

Die Der Wert eines fehlgeschlagenen [dynamischen] Umwandlers in den Zeigertyp ist der Nullzeigerwert des erforderlichen Ergebnistyps.

Unabhängig davon ist es eine gute Idee, nullptr zu verwenden, um den Lesern des Codes klar zu kommunizieren.

Beachten Sie, dass ein fehlgeschlagener dynamic_cast Referenztyp eine Ausnahme auslöst, da es keine Nullreferenz gibt.


Um zu überprüfen, ob ein Objekt o statisch bekannten polymorphen Typ Base ist wirklich ein Derived Sie eine dynamic_cast direkt in einem if Zustand verwenden können – gibt es keine Notwendigkeit, es zu etwas explizit zu vergleichen:

if(auto pd = dynamic_cast<Derived*>(&o)) 
{ 
    // Use pd here 
} 
+0

Der Teil, den ich nicht verstehe, ist, wenn sie "Nullzeigerwert des erforderlichen Ergebnistyps" sagen. Was bedeutet das ? Sollte nicht der Nullzeigerwert irgendeines Typs durch std :: nullptr? Und warum testen Menschen dann auf 0? –

+0

@ John: z.B. Der Nullzeigerwert des erforderlichen Ergebnistyps "int *" ist "static_cast (0)". –

+0

Das ist wirklich verwirrend - aber sollte dann nicht der Nullzeigerwert von irgendwas entweder 0 oder std :: nullptr sein? Es scheint den Zweck zu besiegen, std :: nullptr zu haben. –

Verwandte Themen