[英]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.