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.