簡體   English   中英

dynamic_cast <>失敗但static_cast <>有效

[英]dynamic_cast<> fails but static_cast<> works

在我的項目中,我有一個假設的場景:

  • 1)BaseClass是從父類IFlow派生的接口
  • 2)ChildClass派生自它,即從Base類派生
  • 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在兩個實例中“不起作用”:

  1. 你已經以某種方式編譯了沒有RTTI的代碼。 修復編譯器設置。

  2. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM