2015-11-04 4 views
2

Есть ли что-то не так в следующем коде? В частности, меня интересует использование reinterpret_cast.Использование reinterpret_cast

class Base1 
{ 
public: 
    virtual void foo(){} 
}; 

class Base2 
{ 
public: 
    virtual void bar(){} 
}; 

class Derived : public Base1, public Base2 
{ 
}; 

int main() 
{ 
    Base1* instance1 = new Derived(); 
    instance1->foo(); 

    Base2* instance2 = reinterpret_cast<Base2*>(instance1); 
    instance2->bar(); 

    return 0; 
} 
+0

Является ли наследование 'Base2' непубличным' специально? – emlai

+0

@zenith Нет. Это имеет значение? – ksl

+0

Да. В противном случае вы не можете использовать между «Base2» и «Derived»: http://stackoverflow.com/q/860339/3425536 – emlai

ответ

3

reinterpret_cast не знает, как обращаться с литьем между братьями и сестрами (для Например, в реализациях vtable он не будет исправлять указатель this), поэтому он определенно не работает. Обратите внимание: отображается, чтобы сделать то, что вы ожидаете. В этом случае вы захотите использовать dynamic_cast или поочередно static_cast для получения и использования неявного преобразования в base2.

1

В этом случае простой dynamic_cast к Derived* бы предпочтительнее:

Base2* instance2 = dynamic_cast<Derived*>(instance1); 

(Или static_cast, если вы знаете что *instance1 действительно Derived, и вы не хотите, динамический не рекомендуется.)

+0

Я пробовал 'static_cast', но это не скомпилировалось. – ksl

+0

@ksl Присваивается 'Derived *'. – emlai

Смежные вопросы