2015-11-05 16 views
6

Ich lese das Buch "A Tour of C++" und kann den folgenden Absatz nicht verstehen. Was bedeutet "ein anderer Typ ist inakzeptabel"? Wann also das Pointercasting und wann das Referenzcasting verwendet wird? Kann jemand das ausarbeiten? Vielen Dank.Wann sollte dynamic_cast der Referenz verwendet werden?

Bearbeiten: Die andere Frage, "Difference in behavior while using dynamic_cast with reference and pointers" fragt das Verhalten von dynamic_cast, die ich verstehen konnte - zurückgeben nullptr oder throw Ausnahme. In dieser Frage frage ich, wann ich die eine und wann die andere verwenden soll.

„Wir dynamic_cast auf einen Zeigertyp verwenden, wenn ein Zeiger auf ein Objekt einer anderen abgeleiteten Klasse ein gültiges Argument ist. Wir haben dann testen, ob das Ergebnis nullptr ist. Dieser Test kann oft bequem in platziert werden die Initialisierung einer Variablen in einer Bedingung Wenn ein anderer Typ inakzeptabel ist, können wir einfach dynamic_cast zu einem Referenztyp. Wenn das Objekt nicht vom erwarteten Typ ist, wird bad_cast geworfen: " - Eine Tour von C++ , Abschnitt 4.5.3

Antwort

11

Grundsätzlich, wenn unser Objekt erlaubt ist einer von verschiedenen Typen sein, wir können dynamic_cast auf einen Zeiger so können wir überprüfen, ob die Besetzung gelungen:

void do_if_derived(Base& b) { 
    Derived* d = dynamic_cast<Derived*>(&b); 
    if (d) { 
     // do something 
    } 
    else { 
     // not a Derived, this is OK 
    } 
} 

aber wenn unsere Aufgabe, einen einzigen bestimmten Typ sein muss, wir kann dynamic_cast zu einer Referenz und die Besetzung Wurf lassen, wenn es falsch sein passiert:

void this_better_be_a_derived(Base& b) 
{ 
    Derived& d = dynamic_cast<Derived&>(b); 
    // do stuff with d 
    // will throw if, e.g. b is a DifferentDerived& instead 
} 

es ist eine Frage des Wollens, den Fehlerfall über einen Zweig oder über eine Ausnahme zu behandeln.

5

"Inakzeptabel" bedeutet hier nur "kann nicht akzeptiert werden". Insbesondere nach Ihrem eigenen Code.

können Sie dynamic_cast<T*>(e) verwenden, wenn Sie Ihren eigenen Code, um den Fall behandeln kann, wo *e nicht vom Typ ist T, durch das Ergebnis der Konvertierung überprüft und etwas anderes zu tun, wenn die Konvertierung fehlgeschlagen.

Sie können dynamic_cast<T&>(e) verwenden, wenn die Ausführung Ihres eigenen Codes nicht sinnvoll fortgesetzt werden kann, wenn e nicht vom Typ T ist.

Verwandte Themen