簡體   English   中英

static_cast-為什么在這里工作?

[英]static_cast - Why is it working here?

我有以下代碼片段

class base
{
public:
    virtual void MyMethod()
    {
        std::cout << "Base MyMethod" << "\n";
    }
};


class der : public base
{
public:
    virtual void MyMethod()
    {
        std::cout << "Derived MyMethod" << "\n";
    }
};


void foo(base* b)
{
    der* d = static_cast<der*>(b);
    d->MyMethod();
}

int main()
{
    base* b = new der();
    foo(b);
}

現在我的問題是為什么static_Cast在這里工作。 我讀到static_casts無法轉換多態類型。 那么,為什么上面的示例有效?我在這里丟失了什么嗎? 我期望動態轉換只能解決此類問題,因為它們應與多態類型一起使用? 誰能舉一個靜態轉換失敗而動態轉換通過的示例?

“現在我的問題是為什么static_cast在這里起作用。”

沒有理由不起作用。 類型通過類派生而關聯,並且編譯器知道這些類型。 本質上, static_cast僅限於執行或撤消任何隱式轉換,並且您確實具有從der*base*的隱式轉換。

“我讀到static_cast不能static_cast多態類型。”

那只是balderdash。

“ [snip]誰能舉一個例子,其中static cast會失敗而dynamic cast會通過嗎?”

struct A { virtual ~A(){} };
struct B { virtual ~B(){} };

struct T: A, B {};

auto main()
    -> int
{
    T o;
    A& oA = o;
    //B& oB = static_cast<B&>( oA );    //! This won't compile, unrelated types.
    B& oB = dynamic_cast<B&>( oA );
}

通常使用dynamic_cast將基本指針轉換為派生指針。 這是因為base指向的對象實際上可能不是派生類型。 因此,dynamic_cast執行運行時檢查,如果對象不兼容,則返回空指針。

但是,此運行時檢查會降低性能成本。 如果您完全確定程序邏輯,則強制轉換將成功,則可以改用static_cast並阻止運行時檢查。 但是,如果您弄錯了對象類型,則會得到未定義的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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