2015-11-04 54 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

相關問題