[英]dynamic_cast<> fails but static_cast<> works
在我的項目中,我有一個假設的場景:
3)在childClass初始化函數中,我使用dynamic_cast
將IFlow的對象轉換為BaseClass,如下所示:
void ChildClass::init() { IFlow* pFlow = someMethod(); //it returns the IFlow object pointer //this works for static cast but fails for dynamic cast BaseClass *base = dynamic_cast<BaseClass*>(pFlow) ; }
在上面的代碼中, dynamic _cast
的第二行返回零,但如果dynamic_cast
更改為static_cast
則代碼按預期工作。 請指教
dynamic_cast
在兩個實例中“不起作用”:
你已經以某種方式編譯了沒有RTTI的代碼。 修復編譯器設置。
dynamic_cast
的全部目的是確保演員實際工作。 從孩子到父母的鑄造總是有效的,因為某種類型的每個孩子都保證是那種類型(整個“所有的狗都是動物,但不是所有的動物都是狗”)。 如果對象實際上不是該子類型,則從父級轉換為子級可能會失敗。 如果你提供的IFlow
實際上不是BaseClass
dynamic_cast
將返回一個空指針。
此外,您的static_cast
不起作用。 它只返回一個值。 如果您使用它,則會導致未定義的行為 。 所以它只是“工作”,因為它返回了一個你可以嘗試使用的值。
所以發生了這兩件事之一。 你要找哪一個,因為你沒有給我們someMethod
的實現。
如果喜歡這個?:
class A
{
public:
A(){a = 0;};
virtual ~A(){};
protected:
int a;
};
A *GetAInstance();
class B : public A
{
public:
B() : A() {b = 1;};
virtual ~B(){};
protected:
int b;
};
class C: public B
{
public:
C() : B() {};
~C(){};
void CheckA()
{
A *pA = GetAInstance();
B *pB = dynamic_cast<B*>(pA); --> Here pB is NULL.
B *pB2 = static_cast<B*>(pA);
};
};
A *GetAInstance()
{
A *pA = new A();
return pA;
};
int _tmain(int argc, _TCHAR* argv[])
{
C *pC = new C();
pC->CheckA();
return 0;
}
這是因為您正在嘗試將父指針設置為其子指針。 在dynamic_cast中它認為它不安全,所以它將子指針設置為NULL,你可以看到上面的pB是NULL。 對於子類可能有更多的函數/成員變量,您調用這些新函數/成員變量會導致運行時錯誤。 但是static_cast並不關心這一點,它只是一個編譯器時間檢查而不是運行時檢查。 static_cast只關心它們是否有某種關系。 如果有,static_cast轉換指針甚至不關心運行時錯誤。 請運行此小樣本並檢查pB2是否為NULL。 :)
希望有用。 謝謝! :)
someMethod()返回什么類型? 它需要從BaseClass派生,以允許dynamic_cast工作。 如果不是正確類型,則無法向下投射。
靜態轉換在編譯時工作,編譯器只需將指針翻轉過來。
如果dynamic_cast<>
不合法, dynamic_cast<>
將返回null(零)。 在這種情況下,它正在執行您想要的操作:繼承樹中的某個位置存在問題。 ( static_cast<>
“工作”只是因為它是一個大錘;它在編譯時強制執行轉換而不知道指針在運行時實際具有的類型。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.