[英]When is a `static_cast<Base*>(static_cast<void*>(derived))` from a pointer to a derived class valid?
[英]Should static_cast<Derived *>(Base pointer) give compile time error?
應該static_cast(Base指針)給出編譯時錯誤嗎?
class A
{
public:
A()
{
}
};
class B : public A
{
public:
B()
{
}
};
int main()
{
A *a=new A();
B * b=static_cast<B*>(a); // Compile Error?
}
它不能給出編譯時錯誤,因為在運行時可能存在基派生關系 ,具體取決於所投射指針的地址。 static_cast
始終會成功,但是如果您未static_cast
轉換為正確的類型,則會引發未定義的行為 。 dynamic_cast
可能會失敗,實際上會告訴您是否嘗試轉換為正確的類型。
因此,我認為,僅當設計可以確定存在這種可能性時,才應使用static_cast
進行向下轉換 。 CRTP是一個很好的例子。 因此,在某些情況下這是合乎邏輯的,但是請避免使用它,因為它的行為不確定。
static_cast
不需要RTTI,這從理論上講可能會使其更快 ,但是我將隨時以dynamic_cast
來static_cast
可能導致的未定義行為!
它不會產生編譯時錯誤,因為強制轉換很可能是有效的,並且您通常會在實踐中這樣做,例如:
A* a = new B;
B* b = static_cast<B*>(a); // OK
在代碼中,就編譯器而言,您正在做相同的事情。 它不知道強制轉換將是無效的,因此它可以在編譯時使用。 然而在運行時,你會得到一些討厭的錯誤,只要你嘗試使用的功能B
上的一個實例A
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.