2015-11-04 57 views
2

下面的代码有什么问题吗?我特别感兴趣的是使用reinterpret_castreinterpret_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不知道如何处理兄弟姐妹之间的铸造(for例如在vtable实现中,它不会修复指针this),所以它肯定无法工作。请注意,它可能出现做你的期望。在这种情况下,您需要使用dynamic_cast,或者可以使用static_cast来导出并使用隐式转换为base2

1

在这种情况下,一个简单的dynamic_castDerived*将是首选:

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

(或者static_cast如果你知道*instance1确实是一个Derived,你不希望动态但不推荐)

+0

我试过'static_cast'但没有编译。 – ksl

+0

@ksl转换为“派生*”。 – emlai

相关问题