2016-04-21 15 views
1
class I1 {}; 
class I2 {}; 
class C : public I1, public I2 {}; 
C c; 
I1 *i = static_cast<I1*>(&c); 
C *p = static_cast<C*>(i); 

Ich versuche zu verstehen, wenn zwischen Objektzeiger und Schnittstellenzeiger Casting sicher ist.Zeiger auf Klasse, Implementierung mehrerer Schnittstellen

  • Ist der obige Code falsch? Gibt es Probleme mit dem Slicen von Objekten und warum?

  • Ist static_cast die passende Besetzung hier?

  • Sind die Binärdarstellungen i und p die gleichen?

Antwort

1

Ihr Code ist in Ordnung. Es gibt kein Slicing, weil Sie Pointer, nicht Klassenarten, werfen. Beachten Sie, dass die Besetzung nicht einmal hier gebraucht wird:

I1 *i = static_cast<I1*>(&c); 

static_cast eine geeignete Form für die andere Richtung ist:

C *p = static_cast<C*>(i); 

Wenn Ihre Interface-Klassen haben virtuelle Methoden (was sie in der Regel in einem echten Programm), könnten Sie auch dynamic_cast verwenden, wenn Sie sich nicht sicher über die Art der i bis zur Laufzeit sind:

if (C *p = dynamic_cast<C*>(i)) { 
    // use p 
} 

die poi nt von dynamic_cast ist, dass es RTTI verwendet, um herauszufinden, ob die Besetzung gültig ist. Wenn nicht, wird null zurückgegeben. Wenn Sie static_cast verwenden und der Typ zur Laufzeit nicht korrekt ist, haben Sie ein undefiniertes Verhalten.

Der binäre Wert des abgeleiteten Klassenzeigers ist wahrscheinlich der gleiche wie der Binärwert seiner ersten Basisklasse, aber nicht der zweite. Aber solche Implementierungsdetails sollten Sie nicht interessieren.

Verwandte Themen