#include <iostream>
class Base {
};
class Derived : public Base {
};
int main() {
Base* bptr = new Derived();
Derived* dptr = static_cast<Derived*>(bptr);
std::cout << dptr << std::endl;
}
在上面的代碼中,我應該使用dynamic_cast,但我錯誤地使用了 static_cast。因爲編譯器無法確定我們正在做 正確投射,所以static_cast不應該被使用,而 向下投射。C++ static_cast vs dynamic_cast
爲什麼不是編譯錯誤?我正在使用gcc 4.9.2。你們 認爲這是編譯器中的錯誤,還是C++標準允許這樣的代碼?
編輯:謝謝你的迴應。實際上,上面的基類是多態的 ,即它具有虛函數,但在本例中我省略了它們。我應該 在基地虛擬析構函數中拋出,以明確它是 是多態 - 我的不好。
您可以從'Base *'的'static_cast' 'Derived *',但你是正確的,它不會執行任何類型檢查。它仍然很有用,但如果通過其他方式知道該指針確實指向了「Dervied」對象。如果'Base *'實際上沒有指向Derived *,那麼由'static_cast'產生的Derived *'的任何解引用都會引發未定義的行爲。 –
在所有現實中,這完全是* static_cast是什麼;畢竟,轉向基類指針/引用是隱式完成的。 –